短版本:
我知道导入*
是一种糟糕的做法,最好导入我们明确需要的内容。但是,我很好奇为什么导入util.*
不包括util.stream.*
。
长版本:
如果Iimport 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.04(:
https://www.programiz.com/java-programming/online-compiler/
和Java 12(12.0.1+12(:
https://ideone.com/7XfIFY
您使用的wildcard import
导入包not the sub-packages inside it
中的所有类。
import java.util.*;
上面的import语句将导入java.util包中的所有Classes,而不是子包,即java.util.stream
,所以为了导入它,你需要有像这样的导入语句
import java.util.*;
import java.util.stream.*;
阅读更多关于导入包
虽然包名称看起来更像是层次关系的一种表现,但事实并非如此。
包名称最像是类的前缀。
有关具体说明,请参阅官方文件(软件包的明显层次结构(