为什么调用方法不需要导入类?

时间:2018-08-28 11:04:47

标签: java collections java-8 reference java-stream

前几天我偶然跌倒了。

考虑以下代码(它收集给定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
    ));
}

第一个(lambda)版本不需要import java.util.Map进行编译,第二个版本则需要。{p>

这到底是为什么?我可以想象是因为第二个版本需要在编译时访问Map类以建立引用。但是如何知道Map#keySet()即使不导入Map也存在?

1 个答案:

答案 0 :(得分:12)

请注意,import仅是允许您在代码中使用不合格的类名的一种方法,仅此而已。

由于第一个示例从未明确提及类名Map,因此无需使用缩写符号,而第二个示例确实提及了它。请注意,使用完全限定名称时,第二个示例无需导入即可工作:

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