menu
書いてる野郎
orebike@gmail.com
名前の通りコレクションを 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つ来て何らかの基準でどちらかを採用するというのもありだし、値をマージして新しく作るという動きもできる。