JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样?
代码:List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
for(String s:list){
System.out.println(s);
}
这样?
代码:
List<String > list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
for(int i=0;i<list.size();i++){
System,out.println(list.get(i));
}
Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等本篇只举例list和map, 为了便于理解, 我们先创建一个数据类
PS:为了解决屏幕空间, 注释不标准, 请忽略
首先我们操作list
1.遍历所有人员的名字
代码:
personList.stream().forEach(person -> System.out.println(person.getName()));
2.过滤年龄大于12的
代码:
personList.stream().filter(person ->person.getAge >=12).forEach(person -> System.out.println(person.getAge()));
3.过滤年龄大于12的总人数
代码:
long count = personList.stream().filter(person -> person.getAge() >= 12).count());
System.out.printf("总人数:$s",count);
4.根据年龄排序
代码:
List<Person> list = personList.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.toList());
list.forEach(p -> System.out.printf("姓名:$s,年龄:$s",p.getName(),p.getAge()));
5.获得年龄最小的
6.年龄最大的
7.将所有的名字打印出来并用逗号隔开
8.所有人年龄的总和
9.关于统计类 IntSummaryStatistics
关于Map中Stram的操作
1.list转map
2.在转换过程中, key重复的情况的处理方式
(key1,key2) -> key2是一种表达式, 表示转换map时,如果有两个相同的key,
则取后面的key2替换前面的key1,key1,key2两个关键字可以随意修改.
3.key重复时,将前面的value和后面的value相加
小结:
先说下Stream的优势:它是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源。同时支持函数式编程,代码非常简洁。
Stream是一种用来计算数据的流,它本身并没有存储数据。你可以认为它是对数据源的一个映射或者视图。
它的工作流程是:获取数据源->进行一次或多次逻辑转换操作->进行归约操作形成新的流(最后可以将流转换成集合)。
Stream的特性
1.中间操作惰性执行:一个流后面可以跟随0到多个中间操作,主要目的是打开流,并没有真正的去计算,而是做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历,并没有消耗资源。
还有多个中间操作的话,这里的时间复杂度并不是n个for循环,转换操作都是 lazy 的,多个转换操作只会在 Terminal 操作的时候融合起来,一次循环完成。可以这样简单的理解,Stream 里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,在Terminal操作的时候循环 Stream 对应的集合,然后对每个元素执行所有的函数。
2.流的末端操作只能有一次:当这个操作执行后,流就被使用“光”了,无法再被操作。所以这必定是流的最后一个操作。之后如果想要操作就必须新打开流。
关于流被关闭不能再操作的异常:
这里曾经遇到过一个错误:stream has already been operated upon or closed
意思是流已经被关闭了,这是因为当我们使用末端操作之后,流就被关闭了,无法再次被调用,如果我们想重复调用,只能重新打开一个新的流.