2016-03-24 5 views
4

"parallelStream()"で作成されたリストに参加する際に問題があります。私が欲しい collect()を使用してストリーム内の "並列"リストに結合する

    • 私はList<Pair>を持っているそれらのペアのそれぞれから、「INT」の値
    • のペアが含まれ、私は「)parallelStream(」使用List<Edge>を生成しています:ここで は状況があります&は私が何をしたいのですが(と私はそれが動作すると予想、this answerの最後の箇条書き以下)何List<Edge>

    を「合併」にこれらのリストに参加収集することfolloです翼:align()

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

    CPU集約型の仕事をしている(私は最初の場所でそれを「並列化」する必要がある理由である)とList<Edge>を返します。

    collect()の使用は、次のエラーを与えて、コンパイルから私を防ぎ:私は(IMOが、「醜い」)に類似するために管理しなかった

    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)

    注意バージョンは、さらに私を混乱され、動作します。

    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」を使用しないようしたいと思います。

  • 答えて

    5

    それは100%明確ではないのです)、それはあなたがおそらくしたいように見える

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

    です。 flatMap(Collection :: stream) ':) – fge

    +1

    私の気持ちは、もしあなたが '既に明示的なラムダを書いていれば、そこに '.stream()'コールを折り畳むこともできます。メソッド参照を使用していた場合、私は違った感情を感じるかもしれません。 –

    +1

    さて、私はそれを理解することができます。しかし、私は何とか "ラムダコード"をあまりにも多く書いているので、そのようなコードをできるだけ少なく保つことを念願しています。そして、はい、それは気分でもあります。 – fge

    2

    またとしてList::addAllList::addを置き換えることで、この問題を解決することができます2番目の引数はcollect

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