繁体   English   中英

使用collect()在流中加入“并行”列表

[英]Joining “parallel” lists in a stream using collect()

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

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

我想做的事情(我希望它能够按照这个答案的最后一个要点发挥作用)如下:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM