IntStream 不能直接生成泛型集合,需先调用 boxed() 装箱为 Integer 流,再 collect 收集;Arrays.asList(int[]) 会将整个数组视为单个元素,错误;LongStream、DoubleStream 同理,boolean[] 和 char[] 需特殊处理。

Java 8 的 IntStream 是处理 int 原始类型数组的高效方式,但它不能直接生成泛型集合(如 List<integer></integer>),因为原始流与引用类型存在类型鸿沟。关键在于:先用 boxed() 将 int 装箱为 Integer,再收集为集合。
用 IntStream 将 int[] 转为 List
这是最常见场景。原始数组无法直接用 Arrays.asList()(它会把整个数组当一个元素),必须借助流。
- 步骤清晰:`Arrays.stream(intArray)` → `boxed()` → `collect(Collectors.toList())`
-
代码示例:
int[] nums = {1, 2, 3, 4, 5}; List<Integer> list = Arrays.stream(nums) .boxed() .collect(Collectors.toList()); -
注意:`boxed()` 不可省略,否则编译失败——
IntStream的collect不支持直接转List<integer></integer>。
转其他泛型集合:Set、LinkedList、自定义类型
只要最终目标是引用类型集合,套路一致:装箱 + 指定收集器。
-
转 HashSet(去重):
.collect(Collectors.toSet()) -
转 LinkedList:
.collect(Collectors.toCollection(LinkedList::new)) -
转 ArrayList(显式指定):
.collect(Collectors.toCollection(ArrayList::new)) -
转自定义对象列表(如 Person):需配合
map,例如.map(i -> new Person("user" + i, i)),再boxed()后收集(注意:此处map在boxed()前,操作的是int;若在之后,则操作Integer)
避免常见错误:不要用 Arrays.asList(int[])
Arrays.asList(new int[]{1,2,3}) 返回的是 List<int></int>,即只含一个元素(整个数组),不是你想要的 List<integer></integer>。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误写法:
List<integer> bad = Arrays.asList(new int[]{1,2,3});</integer> - ✅ 正确替代:
Arrays.stream(new int[]{1,2,3}).boxed().toList()(Java 16+)或.collect(Collectors.toList())(兼容旧版)
其他基本类型数组怎么办?
LongStream、DoubleStream 同理,分别用 boxed() 得到 Long、Double 流,再收集。
-
long[] → List<long></long>:Arrays.stream(longs).boxed().collect(...) -
double[] → List<double></double>:Arrays.stream(doubles).boxed().collect(...) -
boolean[]和char[]没有对应原始流,需先转成Integer流或用传统循环(如IntStream.range(0, arr.length).mapToObj(i -> arr[i]))


















