您好我在使用flatmap时有关于并行性的问题 请考虑以下示例
IntStream.of(-1, 1).parallel().flatMap(i->IntStream.range(0,1000).parallel()).forEach(System.out::println);
我是否将内部标志设置为并行是否重要?如果我离开或不离开,结果看起来非常相似。 为什么代码(ReferencePipeline)会对映射进行顺序化? 我对这条线感到困惑:
result.sequential().forEach(downstream);
答案 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