料理:
何か奇妙な私は他の日につまずきました。
(それが与えられたの明確なワード長カウント収集し、次のコードを考えてみましょString
秒、それは重要ではありません):
static void collectByLambda(Collection<String> list) {
Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
Collectors.groupingBy(String::length),
m -> m.keySet()
));
}
そしてそれに相当する方法の参照バージョン:
static void collectByMethodReference(Collection<String> list) {
Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
Collectors.groupingBy(String::length),
Map::keySet
));
}
最初(ラムダ)のバージョンはする必要はありませんimport java.util.Map
コンパイルすること、もう一つはありません。
なぜこれが正確でしょうか?私は2番目のバージョンがアクセス持っている必要があるので、それは想像することができますMap
参照を構築するためにコンパイル時にクラスを。しかし、それはどのようにすることを知っているMap#keySet()
、それがインポートされない場合でも存在しますかMap
?
piet.t:
注import
あなたのコード内の非修飾クラス名を使用できるようにする唯一の手段である、より多くの何もありません。
最初の例は決して明示的にクラス名に言及していないので、Map
2番目の例ではそれを言及しながら、省略表記を可能にする必要はありません。完全修飾名を使用したときに、第2の例では、インポートせずに動作することに注意してください。
static void collectByMethodReference(Collection<String> list) {
Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
Collectors.groupingBy(String::length),
java.util.Map::keySet
));
}