这个问题来自对 another question 的回答,其中建议 map 和 reduce 同时计算总和。
在那个问题中有一个 complexCalculation(e)
,但现在我想知道如何通过将计算分成两部分来进一步并行化,以便 complexCalculation(e)
= part1(e)
* part2(e)
。我想知道是否可以同时计算集合上的 part1 和 part2(再次使用 map()
),然后压缩两个结果流,以便两个流的第 i 个元素与函数 * 组合,从而生成的流等于流可以通过在该集合上映射 complexCalculation(e)
来获得。在代码中,这看起来像:
Stream map1 = bigCollection.parallelStream().map(e -> part1(e));
Stream map2 = bigCollection.parallelStream().map(e -> part2(e));
// preferably map1 and map2 are computed concurrently...
Stream result = map1.zip(map2, (e1, e2) -> e1 * e2);
result.equals(bigCollection.map(e -> complexCalculation(e))); //should be true
所以我的问题是:是否存在一些功能,比如我试图在这里描述的
zip
函数? 最佳答案
parallelStream() 保证按照提交的顺序完成。这意味着您不能假设两个 parallelStreams 可以像这样压缩在一起。
除非您的集合实际上小于您拥有的 CPU 数量,否则您的原始 bigCollection.map(e -> complexCalculation(e))
可能会更快。