java - 为什么不用导入java.util.streams.Stream就可以进行流操作?

标签 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 ?我可能在这里遗漏了一些非常基本的东西,但如果有人能指出来,我将不胜感激。

最佳答案

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

(也有异常(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();

关于java - 为什么不用导入java.util.streams.Stream就可以进行流操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36243376/

相关文章:

android - 订阅后一次性对象为空

java - 迭代列表查找 boolean 属性,返回默认 false

Java : Interface in a class is not accessible while importing

java - 在 onPause、onStop 和 onDestroy 方法中调用父类(super class)方法的正确顺序是什么?为什么?

java - 整数和的总值不等于计算值

lambda - 搜索不一致行为 java-8 流的示例?

multithreading - 中断并行流执行

java - 使用 Stream 从对象列表中查找最常见的属性值

java - 如何使用 Java 8 流清除 HashMap 值内列表的内容

java - 用于 Android 应用程序开发的 JDK