Java 8 Streams中的并行性和Flatmap

时间:2014-06-25 14:24:37

标签: java parallel-processing java-8 java-stream

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

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

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

result.sequential().forEach(downstream);

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

2 个答案:

答案 0 :(得分:11)

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

result.sequential().forEach(downstream);

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

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

答案 1 :(得分:0)

对于像我这样迫切需要并行化 flatMap 并且需要一些实用解决方案的人,不仅仅是历史和理论。

我想出的最简单的解决方案是手动进行展平,基本上是将其替换为 map + reduce(Stream::concat)

已经在另一个帖子中发布了一个包含详细信息的答案: https://stackoverflow.com/a/66386078/3606820