Java 使用强制转换的lambda表达式初始化数组
我试图使用lambda表达式实例化一个数组 我尝试使用的代码是:Java 使用强制转换的lambda表达式初始化数组,java,lambda,java-8,Java,Lambda,Java 8,我试图使用lambda表达式实例化一个数组 我尝试使用的代码是: public class Main { static int x = 0; public static void main(String[] args) { Test[] t = (Test[]) Stream .generate(() -> new Test(x++, 0)) .limit(10)
public class Main {
static int x = 0;
public static void main(String[] args) {
Test[] t = (Test[]) Stream
.generate(() -> new Test(x++, 0))
.limit(10)
.map((Test v) -> {
v.a = v.a * 2;
return v;
})
);
我试图实例化的类称为Test:
public class Test {
int a, b;
Test(int a, int b) {
this.a = a;
this.b = b;
}
}
我无法执行强制转换,它引发了一个异常:
java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为
[Lperson.Test;at person.Main.Main(Main.java:37)java返回:1
但如果您查看对象类:
该数组是一个“[Ljava.lang.Object;”实例
数组的每个对象都是一个“测试”实例
您不能只是投射一个流,然后期望它成为一个数组 使用该方法
测试[]
与对象[]
无关:您不能在两者之间进行强制转换。另外,请注意.toArray()
始终返回对象[]
.Related:除了您的主要问题之外,您应该注意,Stream.generate
创建了一个无序流,它恰好可以实现您对顺序流的意图,但不能保证这一点。此外,滥用map
修改对象是一种不受欢迎的编程风格……更好:Test[]t=new Test[10];Arrays.setAll(t,ix->new Test(ix,0));for(Test v:t)v.a=v.a*2;
而不是size->new Test[size]
你可以只写Test[]::new
@Holger-谢谢你的提醒。
//class "[Ljava.lang.Object;"
System.out.println(
Stream.generate(() -> new Test(x++, 0))
.limit(10)
.map((Test v) -> {
v.a = v.a * 2;
return v;
})
.toArray().getClass()
);
//class "Test"
System.out.println(
Stream.generate(() -> new Test(x++, 0))
.limit(10)
.map((Test v) -> {
v.a = v.a * 2;
return v;
})
.toArray()[0].getClass()
);
Test[] a = Stream.generate(() -> new Test(x++, 0))
.limit(10)
.map((Test v) -> {
v.a = v.a * 2;
return v;
})
.toArray(Test[]::new);