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));