1. Stream 的操作分类
Stream 的操作 | ||
中间操作 | 无状态 | unordered,filter,map,mapToInt,mapToLong,mapToDouble, flatMap,flatMapToInt,flatMapToLong,flatMapToDouble,peek |
有状态 | distinct,sorted,limit,skip | |
结束操作 | 非短路操作 | forEach,forEachOrdered,toArray,reduce,collect,max,min,count |
短路操作 | anyMatch,allMatch,noneMatch,findFirst,findAny |
无状态:指元素的处理不受之前元素的影响;
有状态:指该操作只有拿到所有元素之后才能继续下去。
非短路操作:指必须处理所有元素才能得到最终结果;
短路操作:指遇到某些符合条件的元素就可以得到最终结,如 M || N,只要M为true,则无需判断N的结果。
2.ParallelStream
对于ParallelStream,里面的执行是异步的,使用的线程池是ForkJoinPool.common,可以通过设置-Djava.util.concurrent.ForkJoinPool.common.parallelism = N来调整线程池的大小;
具有平行处理能力,处理的过程会分而治之,也就是将一个大任务切分成多个小任务,这表示每个任务都是一个操作
List<String> lists= Arrays.asList("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19");
lists.parallelStream().forEach(System.out::println);
得到的数据顺序不一定是顺序的
12->14->13->11->10->17->19->18->3->15->6->5->7->9->1->16->2->8->4->
如果想要得到顺序的数据可以使用“forEachOrdered”
List<String> lists= Arrays.asList("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19");
lists.parallelStream().forEachOrdered(System.out::println);
并行流parallelStream()和stream()的区别就是支持并行执行,提高程序运行效率。但是如果使用不当可能会发生线程安全的问题。