使用casted lambda表达式初始化数组

Dav*_*iel 1 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)
                .map((Test v) -> {
                    v.a = v.a * 2;
                    return v;
                }) 
        );
Run Code Online (Sandbox Code Playgroud)

我试图实例化的类名为Test:

public class Test {

int a, b;

 Test(int a, int b) {
    this.a = a;
    this.b = b;
 }
}
Run Code Online (Sandbox Code Playgroud)

我无法执行演员表,它引发了一个例外:

java.lang.ClassCastException:[Ljava.lang.Object; 不能被投射到[Lperson.Test; at person.Main.main(Main.java:37)Java返回:1

但是如果你看一下对象类:

该数组是"[Ljava.lang.Object;" 例

//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()                
        );
Run Code Online (Sandbox Code Playgroud)

数组的每个对象都是一个"Test"实例

//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()                
        );
Run Code Online (Sandbox Code Playgroud)

Old*_*eon 7

您不能只是转换流并期望它成为一个数组.

使用A [] toArray(IntFunction生成器)方法.

    Test[] a = Stream.generate(() -> new Test(x++, 0))
            .limit(10)
            .map((Test v) -> {
                v.a = v.a * 2;
                return v;
            })
            .toArray(Test[]::new);
Run Code Online (Sandbox Code Playgroud)

  • 而不是`size - > new Test [size]`你可以写`Test [] :: new` (2认同)
  • @Holger - 感谢单挑. (2认同)