在java stream的toarray方法中使用lambda表达式,核心是调用重载版本 stream.toarray(intfunction 并传入一个创建对应类型数组的lambda。这样做能解决默认返回 object[] 导致类型不安全的问题,直接获得如 string[] 或 integer[] 等具体类型的数组。

如何获取指定类型的数组对象
使用 toArray(a -> new String[a.length]) 即可将流元素收集为 String[]。该Lambda接收流计算出的长度参数,并返回新创建的数组实例,Stream内部随后将元素填入其中。

import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
String[] strings = Stream.of("A", "B", "C")
.toArray(size -> new String[size]);
System.out.println(strings.getClass()); // class [Ljava.lang.String;
}
}
为什么默认toArray会返回Object数组
如果不传参直接调用 toArray(),Stream只能返回 Object[],因为泛型擦除后无法确定具体的组件类型。这会导致后续强制转换时可能抛出 ClassCastException,因此必须显式提供生成器来锁定类型。

import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Object[] objects = Stream.of("A", "B", "C")
.toArray();
// 下面这行会报错:java.lang.ClassCastException
// String[] strings = (String[]) objects;
}
}
使用Arrays::newArray引用方式是否可行
可以使用方法引用 String[]::new 替代Lambda表达式,效果完全一致。这种写法更简洁,底层依然是向Stream提供一个符合 IntFunction 接口的函数,用于按指定长度创建数组。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











