Arrays.stream()处理原始类型数组需先调用boxed()转为对象流,再collect成集合;boolean[]等无原始流类型,可直接stream.collect。
直接用 arrays.stream() 处理原始类型数组(如 int[]、double[]、long[])时,返回的是对应原始类型流(intstream、doublestream、longstream),不能直接转成 collection<integer></integer> 这类对象集合。要“无缝”转为对象集合流,关键在两步:先转为对象流(boxed),再收集为集合。
为什么需要 .boxed()?
原始类型流(如 IntStream)不持有 Integer 实例,而是以高效方式操作基本值。JVM 不会自动装箱整个流——必须显式调用 .boxed() 才能把每个 int 转成 Integer,从而得到 Stream<integer></integer>,后续才能用 collect(Collectors.toList()) 等操作。
常见原始数组的转换写法
不同原始类型对应不同的 boxed 方法,注意别混淆:
-
int[] arr = {1, 2, 3};→Arrays.stream(arr).boxed().collect(Collectors.toList()) -
long[] arr = {1L, 2L, 3L};→Arrays.stream(arr).boxed().collect(Collectors.toList()) -
double[] arr = {1.0, 2.0};→Arrays.stream(arr).boxed().collect(Collectors.toList())
⚠️ 注意:boolean[]、char[]、byte[]、short[] 没有对应的原始流类型,Arrays.stream() 会直接返回 Stream<t></t>(例如 Stream<boolean></boolean> 或 Stream<character></character>),所以不需要 .boxed() —— 直接 Arrays.stream(boolArray).collect(...) 即可。
转成其他集合类型也很简单
拿到 Stream<integer></integer> 后,你可以自由选择目标集合:
- 转
ArrayList:Arrays.stream(arr).boxed().collect(Collectors.toCollection(ArrayList::new)) - 转
Set(去重):Arrays.stream(arr).boxed().collect(Collectors.toSet()) - 转不可变集合(Java 10+):
Arrays.stream(arr).boxed().collect(Collectors.toUnmodifiableList())
性能与使用提醒
.boxed() 会为每个元素创建新对象,对超大数组有装箱开销和 GC 压力。如果只是遍历或计算(比如求和、过滤),优先用原始流原生方法(如 IntStream.sum()、filter()),避免过早 boxed。只有真正需要对象语义(如存入 Map<integer string></integer>、调用 toString()、泛型集合交互)时,再走 boxed + collect 流程。


















