2015-03-20 3 views
6
Number[][] intArray = new Integer[][]{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; 
double[][] doubleArray = Arrays.stream(intArray) 
          .forEach(pArray -> Arrays.stream(pArray) 
               .mapToDouble(d ->d.doubleValue()) 
               .toArray()) 
          .toArray(); 

Ich mag konvertiert eine Zahl [] [] konvertieren verdoppeln [] []. Das obige Lambda funktioniert nicht, das äußere ToArray wird nicht kompiliert.Java 8 Lambda Number [] [] verdoppeln [] []

Arrays.stream (intArray): Gibt einen Strom von Integer []
forEach: Für jede ganze Zahl [], um einen Strom von ganzen Zahlen zu schaffen, jede ganze Zahl in doppelsträngige Umwandlung und eine Doppel [] zurückkehrt.
Die für jede erstellt die doppelte [] und ich dachte, die äußere toArray würde ein Array dieser doppelten zurückgeben []
Wie kann ich dies zum Funktionieren bringen?

Antwort

9

Hier ist, wie Sie es tun könnte:

double[][] doubleArray = Arrays.stream(intArray) 
           .map(arr -> Stream.of(arr).mapToDouble(Number::doubleValue).toArray()) 
           .toArray(double[][]::new); 

Dieses zerlegt werden kann, wie folgt:

Zuerst verwenden Arrays.stream eine Stream<Number[]> zu erstellen. Dann für jede Number[], erstellen Sie eine Stream<Number>, und verwenden Sie mapToDouble, um DoubleStream und dann toArray(), um die double[] Array zu erhalten.

Der letzte toArray Aufruf wandelt dieses Stream<double[]> in ein double[][] Array um.

3

Vor allem forEach ist Terminalbetreiber mit Rückgabetyp void, so dass Sie nicht

stream().forEach(...).toArray(); 
//     ^void returned here, and void doesn't have `toArray` method 

Sie müssen Ihre Daten in double[] Zeilen verwenden können, um map und sie dann sammeln in double[][], die uns bringt Ihr zweites Problem seit toArray() (aus dem Strom von Objekten) gibt Object[] Array zurück, das nicht in double[][] Referenz gespeichert werden kann. Sie müssen

A[] toArray(IntFunction<A[]> generator) 

verwenden, die richtige Art von Daten angezeigt werden können, so können Sie

toArray(size -> new double[size][]) 

oder die kürzere Version

toArray(double[][]::new) 

Hier verwenden ist, wie Ihr Code aussehen kann:

double[][] doubleArray = Arrays.stream(intArray) 
     .map(
       pArray -> Arrays 
       .stream(pArray) 
       .mapToDouble(d -> d.doubleValue()) 
       .toArray() 
     ).toArray(double[][]::new); 
     //which is equivalent of 
//  ).toArray(size -> new double[size][]); 

//---[Test]--- 
for (double[] row : doubleArray){ 
    System.out.println(Arrays.toString(row)); 
} 

Aus setzen:

[1.0, 2.0, 3.0] 
[4.0, 5.0, 6.0] 
[7.0, 8.0, 9.0]