Java / Ope / Collection操作 / Stream / 終端処理 / collect / toMap

Java / Ope / Collection操作 / Stream / 終端処理 / collect / toMap

名前の通りコレクションを Map に変換する場合に使われる。

キーに重複が無い前提

stream 中の特定の値を key として Map を形成するわけだが特定の値が stream 中でユニークで重複が無いという前提の場合

このようになる。

Map<String, Hoge> hogeMap = hogeList.stream().collect(Collectors.toMap(Hoge::getName, e -> e));

toMap の第一引数にキーを特定するラムダを入れる。この場合は Hoge クラスの getName メソッド参照で記述している。

e -> e.getName()

このように記述しても問題無い。

第二引数では Map の value を何にするかを指定していて、これはそのまま現状の hogeList の要素をそのままになるようにしている。

この記述はこのように書いてもいい

Function.identity()

これは、単に右から左へもってくるラムダを表しているのだが、内部的に処理がシングルトンになっていて、無用な内部的なインスタンスが発生しないようになっていてパフォーマンスが良い。

キーが重複した場合は例外が発生する

キーに重複がある可能性がある場合

このように toMap へ3つ目の引数(ラムダ)を追加する。

Map<String, Hoge> hogeMap = hogeList.stream().collect(Collectors.toMap(Hoge::getName, e -> e, (e1, e2) -> e1));

これは、(今回なら Hoge型の)要素2個をとり、要素1個を返すラムダとなる。 この2個がキーに重複がある要素で、返した要素が value として採用される。つまりこれは コンバイナー の一種である。

2つ来て何らかの基準でどちらかを採用するというのもありだし、値をマージして新しく作るという動きもできる。

java/ope/collection_ope/stream/tarminator/collect/tomap.txt · 最終更新: 2021-02-01 19:41 by ore