2016-04-28 97 views
1

我想通過使用lambda表達式實例化一個數組。通過使用鑄造的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; 
       }) 
     ); 

我試圖實例化類被稱爲測試:

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()     
     ); 
+2

'Test []'與'Object []'無關:你不能在兩者之間進行轉換。另外,請注意'.toArray()'總是返回Object []'。 –

+2

相關:http://stackoverflow.com/questions/5690351/java-stringlist-toarray-gives-classcastexception –

+2

除了你的主要問題,你應該注意'Stream.generate'創建一個* unordered *流恰好做什麼你有意使用順序流,但不能保證如此。此外,濫用'map'來修改對象是一種令人沮喪的編程風格... – Holger

回答

6

你不能只投出流,並期望它成爲一個數組。使用 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); 
+2

而不是'size - > new Test [size]'你可以寫'Test [] :: new' – Holger

+2

@Holger - 謝謝你的提醒。 – OldCurmudgeon

相關問題