【问题标题】:Joining "parallel" lists in a stream using collect()使用 collect() 在流中加入“并行”列表
【发布时间】:2016-03-24 19:33:37
【问题描述】:

我无法加入在“parallelStream()”中创建的列表。 情况如下:

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

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

错误:java:不兼容的类型:无法推断类型变量 R、E(参数不匹配;无效的方法引用不兼容的类型:ArrayList 无法转换为 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”;)

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

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

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

    【讨论】:

    • 同意;虽然在这种情况下我更喜欢.map(p -&gt; align(p.first(), p.second())).flatMap(Collection::stream) :)
    • 我的感觉是,如果你已经在写一个显式的 lambda,你不妨把 .stream() 调用折叠进去;如果您使用的是方法参考,我可能会有不同的感觉。
    • 嗯,我可以理解;但是,我不知何故讨厌编写太多的“lambda 代码”,因此旨在使此类代码尽可能少。是的,这也是一种感觉
    • 好吧,SO 永远不会停止让我惊讶,非常感谢,它实际上似乎工作。当我能够接受你的回答时,我会在大约 5 分钟内接受你的回答,因为你对 SO 本身来说太快了:D。
    【解决方案2】:

    您也可以通过将List::add 替换为List::addAll 作为collect 的第二个参数来解决此问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 2021-04-11
      • 1970-01-01
      • 2017-10-24
      • 2015-01-12
      • 1970-01-01
      • 2014-05-31
      • 2019-06-22
      相关资源
      最近更新 更多