【问题标题】:initialize an array by using casted lambda expressions [duplicate]使用强制转换的 lambda 表达式初始化数组
【发布时间】:2016-08-22 20:32:52
【问题描述】:

我正在尝试使用 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;
                }) 
        );

我要实例化的类叫做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;在 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()                
        );

数组的每个对象都是一个“测试”实例

//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[]Object[] 无关:不能在两者之间转换。另外,请注意.toArray() 总是返回Object[]
  • 除了您的主要问题之外,您应该注意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;

标签: java lambda java-8


【解决方案1】:

您不能只转换一个流并期望它变成一个数组。

使用 A[] toArray(IntFunction generator) 方法。

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

【讨论】:

  • 你可以写Test[]::new而不是size -> new Test[size]
  • @Holger - 感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多