stream 流使用总结与优化

特性:

不是数据结构,没有内部存储。 
不支持索引访问。
延迟计算 支持并行 
很容易生成数据或集合 
支持过滤,查找,转换,汇总,聚合等操作

机制:

1.Stream分为创建操作,中间操作,终止操作。
2.流的源可以是一个数组,集合,生成器方法,I/O通道等等 
3.一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。 
4.Stream只有遇到终止操作,它的源才会开始执行遍历操作。

懒加载

基于编译器优化的考虑,stream 是懒加载的,只有当执行到最终操作的时候,中间操作才会被执行

避免干扰:

在流的操作过程中,一定不要去修改流的数据源,如果有干扰发生,程序会抛出异常

stream 的性能:何时使用,stream 是并行的,多核处理

优势: 多使用stream Api,只要java stream 库做了升级优化,代码不用修改都可以享受到升级带来的好处
劣势: 
1:  对于普通的数字(int/list) 遍历,普通for 循环的效率确实比 stream 串行流效率高1.5-2.5倍,但是Stream流可以利用并行执行的方式发挥CPU的多核优势,因此并行流计算执行效率高于for循环。
2:对于list-Object类型的数据遍历,普通for循环和Stream串行流比也没有任何优势可言,更不用提Stream并行流计算。

* Stream并行流计算 >> 普通for循环 ~= Stream串行流计算 (之所以用两个大于号,你细品)
* 数据容量越大,Stream流的执行效率越高。
* Stream并行流计算通常能够比较好的利用CPU的多核优势。CPU核心越多,Stream并行流计算效率越高。

流分类:

List<Integer> numbers = Arrays.asList(1, 2, 3);
1: 顺序流/串行流:
numbers.stream().forEach(n -> System.out.print(n));    

2:并行流:
numbers.parallelStream().forEach(n -> System.out.print(n));

创建操作:

数组:stream.of();
集合:stream();
通过Stream.generate方法来创建 
通过Stram.iterate方法
中间操作:
1:去重
List<Integer> list = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
 List<Integer> newList = list.stream().distinct().collect(Collectors.toList());

2:filter 过滤

list.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());

3:排序:

list.stream().sorted().collect(Collectors.toList());//默认自然排序从小到大 
list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
//倒序
list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());

终止操作:

1:collect 收集

list.stream().limit(2).collect(Collectors.toList()); 
list.stream().limit(2).collect(Collectors.toSet()); 
list.stream().limit(2).collect(Collectors.toMap(Object::getName, Object::getAge));

 

posted @ 2020-08-17 10:03  石shi  阅读(126)  评论(0编辑  收藏  举报