【问题标题】:Why importing java.util.* is not enough to import stream? [duplicate]为什么导入 java.util.* 不足以导入流? [复制]
【发布时间】:2021-09-26 18:54:55
【问题描述】:

短版:

我知道导入* 是一种不好的做法,最好明确导入我们需要的内容。但是,我很好奇为什么导入util.* 不包括util.stream.*

长版:

如果我import java.util.stream.*;

这段代码运行成功:

int[] a = {3, 4, 1};
ArrayList<Integer> list = Arrays.stream(a)
                          .boxed()
                          .collect(Collectors.toCollection(ArrayList::new));

但是,如果我从 import 中删除 stream

import java.util.*;

失败了:

Main.java:20: error: cannot find symbol
                                .collect(Collectors.toCollection(ArrayList::new));
                                         ^
  symbol:   variable Collectors
  location: class Ideone
1 error

我已经尝试过使用 Java 8 (1.8.0_201):

https://www.onlinegdb.com/online_java_compiler

Java 11 (11.0.11+9-Ubuntu-0ubuntu2.20.04):

https://www.programiz.com/java-programming/online-compiler/

和 Java 12 (12.0.1+12):

https://ideone.com/7XfIFY

【问题讨论】:

  • 这就是语言的设计方式。虽然我可以大胆猜测为什么它是这样设计的:限制范围。对于您期望发生的行为,导入java.util.* 将导入所有java.utiljava.util.streamjava.util.regexjava.util.zipjava.util.jarjava.util.cocurrentjava.util.concurrent.atomicjava.util.concurrent.locksjava.util.functionjava.util.spi。这有点荒谬,不是吗?

标签: java import java-8 java-stream


【解决方案1】:

您正在使用wildcard import 导入包not the sub-packages inside it 中的所有类。

import java.util.*;

上述导入语句将导入java.util包内的所有Classes 而不是子包,即java.util.stream ,所以为了导入它,你需要有类似的导入语句

import java.util.*;
import java.util.stream.*;

Read more on Importing packages

【讨论】:

    【解决方案2】:

    虽然包名看起来更像是一种层次关系的体现,但其实不然。

    包名最像类的前缀。

    具体说明请参考official document(Apparent Hierarchies of Packages)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2018-11-18
      • 1970-01-01
      相关资源
      最近更新 更多