<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