MENU

Collectors.toMap()の重複キー3つ以上のマージ処理について


public static void main(String[] args) {

Stream<String> stream1 = Stream.of("nao","akko","ami");

Map<Integer, String> map1 =stream1.collect(Collectors.toMap(String::length, s -> s,(s1,s2) -> s1 + ":" +  s2));

System.out.println(map1);

System.out.println(map1.getClass());

Stream<String> stream2 = Stream.of("nao","akko","ami","aaa");

Map<Integer, String> map2 = stream2.collect(Collectors.toMap(String::length, s -> s, (s1,s2) -> s1 + " : " + s2, TreeMap::new));

System.out.println(map2);

System.out.println(map2.getClass()); }

collect()メソッドについて

<TreeMap<Integer, String>, Object> TreeMap<Integer, String> java.util.stream.Stream.collect(Collector<? super String, Object, TreeMap<Integer, String>> collector)

toMap()メソッドについて

<String, Integer, String, TreeMap<Integer, String>> Collector<String, ?, TreeMap<Integer, String>> java.util.stream.Collectors.toMap(Function<? super String, ? extends Integer> keyMapper, Function<? super String, ? extends String> valueMapper, BinaryOperator mergeFunction, Supplier<TreeMap<Integer, String>> mapSupplier)
 
 

とても複雑な構造です汗
 
Eclipsejavadocから直接コピペしたんので一瞬引数の表示の仕方に戸惑いました・・・
toMap()についてはjdcから理解するのをやめました・・・w
めんどくさいんで汗
 
ストリームをMapにするメソッドなのですが・・・・
キーが重複するとエラーになるそうで・・・・
このように、String::length, s -> s,(s1,s2) -> s1 + ":" +  s2、と引数を三つとってやることで第三引数に重複キーのマージ処理を指定することができるそうで・・・・
 
ここからが本題なのですが・・・・
Stream<String> stream2 = Stream.of("nao","akko","ami","aaa");のように重複が2つ以上あったらどうなるんかなーと思ったら
 
{3=nao : ami : aaa, 4=akko}と返りました。
 
さすが公式SE8API感服です。
しっかりと、3=nao : ami : aaaとなり3つの重複を確認^^
 
メソッドの中がどのような操作になっているかすごい気になりますが・・・・