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

Deb*_*Ray 3 java java-8 java-stream

在进行流操作时,

int sum = list.stream().filter(i -> i > 0).mapToInt(i -> i).sum();

得到a中所有正数的总和list,我们Stream<Integer>在中间阶段使用a ,但这不需要导入java.util.stream.Stream.

现在,做同样的事情,当我写作时,

Stream<Integer> stream = list.stream();
int sum = stream.filter(i -> i > 0).mapToInt(i -> i).sum();
Run Code Online (Sandbox Code Playgroud)

它产生完全相同的结果,但我需要,import Stream因为我声明的变量需要该类型.

那么,为什么list.stream()我提到的第一种方式中的部分不需要我导入Stream?我可能会遗漏一些非常基本的东西,但如果有人能够指出,我会非常感激.

Ste*_*n C 12

如果您在源代码中使用非限定标识符明确命名类标识符,则只需导入类标识符.

(也有例外......)


import声明的目的是消除歧义; 即在...

    Stream<Integer> stream = ...
Run Code Online (Sandbox Code Playgroud)

标识符Stream引用哪个类?

  • java.util.stream.Stream
  • 你写的一些课程?
  • 某些第三方图书馆的某些课程?

一种import说法可以说是哪一个.

例子.

1)Stream该类未在源代码中命名

    // no import required
    int sum = list.stream().filter(i -> i > 0).mapToInt(i -> i).sum();
Run Code Online (Sandbox Code Playgroud)

请注意,这里没有歧义.编译器知道stream()调用结果的完整类名.编译列表类时已解析全名,并且它已嵌入到类文件中.

2)Stream该类以其完全限定名称命名:

    // no import required
    java.util.stream.Stream<Integer> stream = list.stream();
Run Code Online (Sandbox Code Playgroud)

3)Stream该类以不合格的名称命名:

    // import required
    Stream<Integer> stream = list.stream();
Run Code Online (Sandbox Code Playgroud)

  • `import`语句的目的是消除歧义."Stream"指的是哪个类?`java.util.stream.Stream`或某些第三方库中的某些类?`import`语句说明哪一个. (2认同)
  • *"在无需导入的部分中,不是在中间阶段创建的Stream <Integer>?"* - 是的.但是,从您在那里调用的>> compiled <<方法的签名中可以知道该类型的完全限定名称.只有在Java源代码中通过简单名称引用类时,才会出现歧义问题. (2认同)