为什么我可以在不必导入java.util.streams.Stream的情况下执行流操作?

时间:2016-03-27 03:01:58

标签: java java-8 java-stream

执行流操作时,

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?我可能会遗漏一些非常基本的东西,但如果有人能够指出,我会非常感激。

1 个答案:

答案 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();