作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这个问题源于对 another question 的回答,其中建议 map 和 reduce 同时计算总和。
在那个问题中有一个 complexCalculation(e)
,但现在我想知道如何通过将计算分成两部分来进一步并行化,以便 complexCalculation(e)
= 第 1 部分(e)
* 第 2 部分(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 可以像这样压缩在一起。
您的原始 bigCollection.map(e -> complexCalculation(e))
可能会更快,除非您的集合实际上小于您拥有的 CPU 数量。
关于java - 有没有办法压缩两个流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32136577/
我是一名优秀的程序员,十分优秀!