[英]Joining “parallel” lists in a stream using collect()
我在加入在“parallelStream()”中创建的列表时遇到问题。 情况如下:
List<Pair>
包含“int”值对 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.