当进行流式操作时,
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
?我可能在这里遗漏了一些非常基本的东西,但如果有人能指出来,我将不胜感激。
如果您在源代码中使用非限定标识符明确命名它,则只需导入类标识符。
(也有异常(exception)...)
import
语句的目的是消除歧义;即在
Stream<Integer> stream = ...
标识符Stream
指的是哪个类?
java.util.stream.Stream
?
- 你编写的一些类?
- 某个第 3 方库中的某个类?
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();