web-dev-qa-db-ja.com

Java 8 Stream Map <K、V> to List <T>

2つのパラメーターを取り、1つの値を返す関数がある場合、非終端操作としてMapをStreamのリストに変換することは可能ですか?私が見つけた最も近い方法は、マップ上でforEachを使用してインスタンスを作成し、事前定義されたリストに追加してから、そのリストから新しいストリームを開始することです。それとも私は何かを見逃したのですか?

例:古典的な「単語の長いリストから最も頻繁に出現する3つの単語を見つける」

wordList.stream().collect(groupingBy(Function.identity, Collectors.counting))).

(今、そのマップのentrySetをストリーミングしたい)

sorted((a,b) -> a.getValue().compareTo(b.getValue))).limit(3).forEach(print...
23
JamesCherrill

マップのentrySetを取得し、バイナリ関数の呼び出しにエントリを接着する必要があります。

inputMap.entrySet().stream().map(e->myFun(e.getKey(),e.getValue()));

上記の結果は、Tインスタンスのストリームです。

更新

追加の例は、以下のコメントで議論された内容を確認します:group byおよびsortは、本質的に端末操作です。出力の最初の要素でさえも生成できるようにするためにフルを実行する必要があるため、非端末操作としてそれらを含めることはパフォーマンス/メモリフットプリントに関して何も買いません。

Java 8はsortedを非端末操作として定義しますが、操作がすべてのアップストリーム要素を受信するまで操作がブロックされるため、不正なコードにつながる可能性があります。受信中にそれらをすべて保持する必要があります。

53
Marko Topolnik