小编qdr*_*ien的帖子

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

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

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

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

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

随着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));
Run Code Online (Sandbox Code Playgroud)

v2:

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

有人可以帮我弄这个吗?我想避免放弃并使用"v2";)

java java-8 java-stream

4
推荐指数
1
解决办法
781
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1