Java 8 Streams中的并行性和Flatmap

Ben*_*ünz 14 java parallel-processing java-8 java-stream

您好我在使用flatmap时有关于并行性的问题请考虑以下示例

    IntStream.of(-1, 1).parallel().flatMap(i->IntStream.range(0,1000).parallel()).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

我是否将内部标志设置为并行是否重要?如果我离开或不离开,结果看起来非常相似.为什么代码(ReferencePipeline)会对映射进行顺序化?我对这条线感到困惑:

result.sequential().forEach(downstream);
Run Code Online (Sandbox Code Playgroud)

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/stream/ReferencePipeline.java#ReferencePipeline.flatMap%28java.util.function.Function% 29

Dan*_*ári 11

在当前的JDK(jdk1.8.0_25)中,答案是否定的,将内部标志设置为并行并不重要,因为即使你设置它,.flatMap()实现设置也会将流返回到顺序:

result.sequential().forEach(downstream);
Run Code Online (Sandbox Code Playgroud)

("结果"是内部流,它的顺序()方法的文档说:返回顺序的等效流.可以返回自身,因为流已经是顺序的,或者因为基础流状态被修改为顺序.)

在大多数情况下,可能没有努力使内部流并行; 如果外部流的项目数至少与可以并行运行的线程数相同(我的计算机中的ForkJoinPool.commonPool().getParallelism()= 3).