2015-03-20 16 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(); 

Voglio convertire un numero [] [] per raddoppiare [] []. La lambda precedente non funziona, l'outer toArray non viene compilato.Java 8 Lambda per convertire Numero [] [] per raddoppiare [] []

Arrays.stream (intArray): Restituisce un flusso di Integer []
forEach: per ogni intero [], creando un flusso di numeri interi, la conversione di ogni intero in letto e la restituzione di un doppio [].
Il per ogni crea il doppio [] e pensavo che l'esterno aArray restituisse un array di questo doppio []
Come posso farlo funzionare?

risposta

9

Ecco come si potesse fare:

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

Questo può essere scomposta come segue:

Per prima cosa utilizzare Arrays.stream di creare un Stream<Number[]>. Quindi per ogni Number[], si crea un Stream<Number> e si utilizza mapToDouble per ottenere DoubleStream e quindi toArray() per ottenere l'array double[].

La chiamata finale toArray trasforma questo Stream<double[]> in un array double[][].

3

Prima di tutto forEach è operatore terminale con tipo di ritorno di void in modo non è possibile utilizzare

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

È necessario map i dati in double[] righe, e poi raccogliere in double[][], che ci porta a il secondo problema dal toArray() (dal flusso di oggetti) restituisce l'array Object[] che non può essere memorizzato nel riferimento double[][]. È necessario utilizzare

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

che restituirà tipo corretto di dati, in modo da poter utilizzare

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

o la sua versione più corta

toArray(double[][]::new) 

Ecco come il codice può essere simile:

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)); 
} 

Fuori put:

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