"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」を使用しないようしたいと思います。
です。 flatMap(Collection :: stream) ':) – fge
私の気持ちは、もしあなたが '既に明示的なラムダを書いていれば、そこに '.stream()'コールを折り畳むこともできます。メソッド参照を使用していた場合、私は違った感情を感じるかもしれません。 –
さて、私はそれを理解することができます。しかし、私は何とか "ラムダコード"をあまりにも多く書いているので、そのようなコードをできるだけ少なく保つことを念願しています。そして、はい、それは気分でもあります。 – fge