<T,K,U>は、そのメソッドの中で使うジェネリック型のリストです。staticメソッドの場合は、インスタンスによるジェネリック型の指定が無いので、メソッド単位に指定する必要があります。
このメソッドでは異なる3種類の型が必要になっていて、それぞれ
- 元々のコレクション(ストリーム)の要素である
T
- グループ化した後のマップのキーである
K
- 同じくマップの値である
U
になります。
以下の例を見てください。
lang
1// import java.util.Map;
2// import java.util.function.Function;
3// import java.util.stream.*;
4
5Function<String, String> keyMapper = x -> x;
6Function<String, String> valueMapper = String::toUpperCase;
7Stream<String> stream = Stream.of("apple", "banana", "armond", "citrus", "cherry");
8Map<String, String> a = stream.collect(Collectors.toMap(keyMapper, valueMapper));
9System.out.println(a);
10// => {banana=BANANA, cherry=CHERRY, apple=APPLE, armond=ARMOND, citrus=CITRUS}
元のコレクションの要素はString、つまりStream<String>です。
keyMapperは、StringをStringに変換する関数、つまりFunction<String, String>です。
valueMapperは、StringをStringに変換する関数、つまりFunction<String, String>です。
変換する関数は、型は同じですが内容は変換してもしなくても動作します。実際、この例ではキーの方は何も変換していません。
この場合は、コレクションの要素も、マップのキーも値も、すべてがStringなので、<T,K,U>はすべてStringになります。
今度はジェネリック型が異なる例です。
あまり良い例ではありませんが、TをInteger、KをString、UをListにしたパターンです。
lang
1// import java.util.Map;
2// import java.util.function.Function;
3// import java.util.stream.*;
4
5Function<Integer, String> keyMapper = x -> "key-" + x;
6Function<Integer, List<Integer>> valueMapper = x -> Arrays.asList(x);
7Stream<Integer> stream = Stream.of(1, 2, 3, 4); // オートボクシング
8Map<String, List<Integer>> a = stream.collect(Collectors.toMap(keyMapper, valueMapper));
9System.out.println(a);
10// => {key-1=[1], key-4=[4], key-3=[3], key-2=[2]}
(※実際のコレクション要素の型はintですが、オートボクシングでIntegerになっています。ここでは説明のためにあえてオートボクシングを使っていますが、intのストリームを扱う場合はIntStreamを使ったほうが良いです。)
元のコレクションの要素はInteger、つまりStream<Integer>です。
keyMapperは、IntegerをStringに変換する関数、つまりFunction<Integer, String>です。
valueMapperは、IntegerをList<Integer>に変換する関数、つまりFunction<Integer, List<Integer>>です。
このように、異なる3種類の型が必要なことが分かります。
参考リンク:
java.util.stream.Collectors - Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function-
2016/08/12 06:55