最近、Java 8のストリームについて学び、それらのストリームで作業を開始しました。今私はgroupingBy
コレクタ方法に関する質問をしている:通常私は、.NETで動作Java 8 GroupingBy into Peek
ので、私は、.NET IEnumerable<T>
でのJava Stream<T>
(そうでない同じある知っ)と比較しました。この比較の後、List<T>
が要素を格納し、具体的にはStream
/IEnumerable
が操作を適用します。一例:
C番号:
elements.Where(x => x.Value == 5).ToList();
ジャワ:両方の例で
elements.stream().filter(x -> x.getValue() == 5).collect(Collectors.toList());
、私は、リストを開始する(この例ではフィルタ)操作を定義し、格納するために結果を収集それ(この例では新しいリストにあります)。
data.stream()
.map(...).filter(...) // Some operations
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)));
このクエリの結果はMap<String, Long>
であり、私はこれで動作することができますが、私はそれを格納するのではなく、このデータを続行し、言うことができます:
しかし、この方法では、私はストリームを残し、最初の結果をマップに保存し、新しいストリームを開いて続行します。コレクターなしでグループ化する方法はありますか?私はストリームに "滞在"できますか?
グルーピングしているので、中間ストアに行く必要があります。ストリームの先頭にある値を最後にグループ化する必要がある場合はどうしたらいいですか?あなたは「すべて」を処理し、グループ化することが何もない限り、それを保存する必要があります。したがって、内部的には、Javaは、マップ(または同様の構造)内に物事を置く必要があります。あなた自身がこれをやっているのはどういうことですか? –
それは本当に問題ではない、私は些細なアプローチで生きることができるが、私の他のすべてのストリーム操作では、 'List'を持つことと' Stream'を持つことの間に明確な線があった。私はそれを開いて操作し、収集した。今すぐ新しいストリームのために開かれる地図があるので、別のアプローチで可能かどうか疑問に思っていました。 –
おそらく私の.NETの背景に混乱しているかもしれません。そこであなたは 'IEnumerable'でどんな操作をしてもかまいません。最後に、' ToList'、 'ToArray'、' ToDictionary'を介して結果を収集するか、それを反復処理します。 –