执行流操作时,
int sum = list.stream().filter(i -> i > 0).mapToInt(i -> i).sum();
要获取list
中所有正数的总和,我们在中间阶段使用Stream<Integer>
,但这不需要导入java.util.stream.Stream
。
现在,做同样的事情,当我写作时,
Stream<Integer> stream = list.stream();
int sum = stream.filter(i -> i > 0).mapToInt(i -> i).sum();
它产生完全相同的结果,但我需要import Stream
,因为我声明的变量需要该类型。
那么,为什么我提到的第一种方式list.stream()
部分不要求我导入Stream
?我可能会遗漏一些非常基本的东西,但如果有人能够指出,我会非常感激。
答案 0 :(得分:12)
如果您在源代码中使用非限定标识符明确命名类标识符,则只需导入类标识符。
(也有例外......)
import
声明的目的是消除歧义;即在
Stream<Integer> stream = ...
标识符Stream
引用哪个类?
java.util.stream.Stream
? import
语句可以说出哪一个。
实施例
1)源代码中未命名Stream
类
// no import required
int sum = list.stream().filter(i -> i > 0).mapToInt(i -> i).sum();
请注意,这里没有歧义。编译器知道stream()
调用结果的完整类名。编译列表类时已解析全名,并且它已嵌入到类文件中。
2)Stream
类以其完全限定名称命名:
// no import required
java.util.stream.Stream<Integer> stream = list.stream();
3)Stream
类以非限定名称命名:
// import required
Stream<Integer> stream = list.stream();