java8流应用
流(stream): 从支持数据处理操作的源生成的元素序列;
1、使用流:
- 一个数据源(如集合)来执行一个查询;
- 一个中间操作链,行程一条流的流水线;
- 一个终端操作,执行流水线,并生成结果。
2、操作简介(图片来自-java+8实战):
3、终结操作 collect 执行流并生成结果的执行流程
其对应java 8 jdk源码:
并行流(parallelStream)
1、释义
一个将内容分成多个数据块,并用不同的线程分别处理每个数据块的流。
2、使用注意:
- 1、并行使用的前提,在内核中并行执行工作的时间比在内核之间传输数据的时间要长。
- 2、并行流的使用算法中不能改变共享变量的值或状态(即,并行流非现场安全的)。
3、配置并行流使用的线程池
并行流的内部默认使用了ForkJoinPool,默认线程数为处理器的数量n,n = Runtime.getRuntime().availableProcessors();
可以通过设置系统属性来更改n的大小,例如:
System.setProperty(“java.util.concurrent.ForkJoinPool.common.parallelism”,“10”);
此处应当谨慎修改
4、Spliterator
java8的新接口,“可拆分迭代器” ,同Iterator一样,用于遍历集合中的元素,Spliterator接口定义了结果接口,如下
java8中,Collection集合的所有的数据结构中都提供了默认的Spliterator实现
Spliterator接口中,最主要的是trySplit()方法,此方法就是Spliterator实现数据源的拆分,并让数据元素并行执行处理的主要方法,其原理如下
-
并行流拆分数据源过程:
-
拆分对应的实现源码eg1:
-
拆分对应的实现源码eg2:
还有诸多实现,可查看java8 jdk源码
(PS:以上仅为个人学习的理解,如有不正确的对方,还望指正。)