前几天我偶然跌倒了。
考虑以下代码(它收集给定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
也存在?
答案 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
));
}