2017-01-09 10 views
6

最近、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>であり、私はこれで動作することができますが、私はそれを格納するのではなく、このデータを続行し、言うことができます:

は今、私は、より複雑なケースを得ました。私の現在のアプローチは簡単です:

しかし、この方法では、私はストリームを残し、最初の結果をマップに保存し、新しいストリームを開いて続行します。コレクターなしでグループ化する方法はありますか?私はストリームに "滞在"できますか?

+1

グルーピングしているので、中間ストアに行く必要があります。ストリームの先頭にある値を最後にグループ化する必要がある場合はどうしたらいいですか?あなたは「すべて」を処理し、グループ化することが何もない限り、それを保存する必要があります。したがって、内部的には、Javaは、マップ(または同様の構造)内に物事を置く必要があります。あなた自身がこれをやっているのはどういうことですか? –

+0

それは本当に問題ではない、私は些細なアプローチで生きることができるが、私の他のすべてのストリーム操作では、 'List'を持つことと' Stream'を持つことの間に明確な線があった。私はそれを開いて操作し、収集した。今すぐ新しいストリームのために開かれる地図があるので、別のアプローチで可能かどうか疑問に思っていました。 –

+0

おそらく私の.NETの背景に混乱しているかもしれません。そこであなたは 'IEnumerable'でどんな操作をしてもかまいません。最後に、' ToList'、 'ToArray'、' ToDictionary'を介して結果を収集するか、それを反復処理します。 –

答えて

4

APIは現在のところ、エスケープできません。

groupingBy

その操作がストリームを終了するように、端末操作(それはストリームを返さない)です。

最後のマップ操作で後で実行する内容に応じて、ストリーム内に「保持」するカスタムコレクタを作成できます。たとえあなたがおそらくまだ要素をMapに集めているとしても。

+0

そこにありますか?任意のコレクタ操作は終端ではありませんか?もしそうでなければ、私はこれが設計によるものだと想定しているので、手動で新しいストリームを開くほうがいいでしょうか? –

+1

@lukegvいいえありません。あなたが正しいです。 – Eugene

5

操作をCollectorとして説明できるのであれば、ダウンストリームコレクタで好きなことを行うことができます。現在のところ、中間操作map、コレクタmappingのコレクタだけに相当しますが、Java 9にはfilteringflatMapping(Java 8でも実装可能です)があり、ほぼすべての端末操作に相当します。もちろん

、コレクターのネストされたアプライアンスは、同じことをやってストリーム操作の連鎖とはまったく異なって見えます...

、しかし、あなたは完全なグループを処理したい場合は、groupingコレクションを完了周りに方法はありません最初。これはAPIの制限ではなく、グループ化操作または一般的な操作に固有で、完全な結果を処理する場合は、操作を最初に完了する必要があります。どのようにAPIがどのように見えるかにかかわらず、 collectingAndThenのような方法でコレクタのフォローアップ操作を隠すことができ、グループのメンテナンスを行うマップであるため、Mapの作成と埋め込みは避けられません。グループは、Mapのキーおよびルックアップロジックによって決定されます。 SortedMapとカスタムコンパレータまたはIdentityHashMapを使用すると、グループ化ロジックを完全に変更できます。

関連する問題