java - 使用 collect() 在流中加入 "parallel"列表

标签 java java-8 java-stream

我在加入在“parallelStream()”中创建的列表时遇到问题。 这是情况:

  • 我有一个 List<Pair>包含成对的“int”值
  • 从每一对中,我生成一个 List<Edge>使用“parallelStream()”
  • 我想收集这些列表并将其加入“合并”List<Edge>

我想做的(我希望它能工作,遵循 this answer 的最后一个要点)如下:

List<Edge> edges = pairs.parallelStream()
        .map(p -> align(p.first(), p.second()))
        .collect(ArrayList::new, List::add, List::addAll);

align()做 CPU 密集型工作(这就是为什么我首先需要“并行化”它)并返回 List<Edge> .

collect()的使用阻止我编译,出现以下错误:

Error: java: incompatible types: cannot infer type-variable(s) R,E (argument mismatch; invalid method reference incompatible types: ArrayList< Edge > cannot be converted to int)

请注意,我确实设法让类似(但“更丑陋”的 imo)版本工作,这让我更加困惑:

v1 :

List<List<Edge>> collect = pairs.parallelStream()
        .map(p -> align(p.first(), p.second()))
        .collect(Collectors.toList());
collect.forEach(l -> l.forEach(edges::add));

v2 :

List<Edge> edges = new ArrayList<>();
pairs.parallelStream()
        .map(p -> align(p.first(), p.second()))
        .collect(Collectors.toList()).forEach(edges::addAll);

有人可以帮我解决这个问题吗?我想避免放弃和使用“v2”;)

最佳答案

这不是 100% 清楚,但看起来你可能想要

List<Edge> edges = pairs.parallelStream()
    .flatMap(p -> align(p.first(), p.second()).stream())
    .collect(Collectors.toList());

关于java - 使用 collect() 在流中加入 "parallel"列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36208597/

相关文章:

Java 函数式编程 : creating a map of functions

Java流将数组收集到一个列表中

java - JMeter - 无法在 JSR223 脚本中使用 Java 流

java - 打开图像资源 Java JDK 8

java - 使用 Java 8 Streams 如何使用一个列表获取两个不同的列表

Eclipse 调用层次结构 lambda

java - Java 正则表达式中 matches() 和 find() 之间的区别

java - 删除 JDBC 创建的行李的正确方法?

java - 使用 RSA 从 C# 到 Java 的 Base64 编码字符串到公钥

java 8流收集最大对象并按属性区分