なぜクラスの輸入を必要としないメソッドを呼び出していますか?

料理:

何か奇妙な私は他の日につまずきました。

(それが与えられたの明確なワード長カウント収集し、次のコードを考えてみましょ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あなたのコード内の非修飾クラス名を使用できるようにする唯一の手段である、より多くの何もありません。

最初の例は決して明示的にクラス名に言及していないので、Map2番目の例ではそれを言及しながら、省略表記を可能にする必要はありません。完全修飾名を使用したときに、第2の例では、インポートせずに動作することに注意してください。

static void collectByMethodReference(Collection<String> list) {
    Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
            Collectors.groupingBy(String::length),
            java.util.Map::keySet
    ));
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=136442&siteId=1