Java 8 流中的并行性和平面映射

请考虑以下示例:

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

我是否将内部标志设置为并行有关系?结果看起来非常相似,如果我把它留不掉。

另外,为什么代码 () 按顺序排列映射?ReferencePipeline

我对这句话感到困惑:

result.sequential().forEach(downstream);

答案 1

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

result.sequential().forEach(downstream);

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

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


答案 2

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

我想出的最简单的解决方案是手工做扁平化,基本上是用.map + reduce(Stream::concat)

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


推荐