我在加入在“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/