java - 有没有办法压缩两个流?

标签 java concurrency java-8 java-stream

这个问题源于对 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/

相关文章:

java - 使用 Gson for ReSTLet 将 Post 数据(Representation)转换为 Object

database - 在 Entity Framework 中使用累积的存储桶值

Java 8 并发 HashMap

java - 如何在java 8中创建嵌套对象列表?

java-8 - 当键与 Java Stream API 重复时如何添加 Map 的内部元素

Java 10 JavaFX java.lang.IllegalAccessError

javax.xml.transform.TransformerFactory Unicode 问题 - Java

Java "in-order"信号量

java-8 - 如何从 Java8 的 spliterator 中的 tryAdvance 方法返回值?

java - 我可以通过BufferedImage读取InputStream吗?