【发布时间】: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):
【问题讨论】:
-
这就是语言的设计方式。虽然我可以大胆猜测为什么它是这样设计的:限制范围。对于您期望发生的行为,导入
java.util.*将导入所有java.util、java.util.stream、java.util.regex、java.util.zip、java.util.jar。java.util.cocurrent、java.util.concurrent.atomic、java.util.concurrent.locks、java.util.function和java.util.spi。这有点荒谬,不是吗?
标签: java import java-8 java-stream