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

Chcę przekonwertować liczbę [] [] na podwójne [] []. Powyższa wartość lambda nie działa, zewnętrzna toArray nie kompiluje się.Java 8 Lambda do konwersji Liczba [] [] do podwójnego [] []

Arrays.stream (intArray) Zwraca strumień Integer []
forEach: dla każdego całkowita [], tworząc strumień liczby całkowite przekształcenie każdej liczby całkowitej w podwójne i powrót podwójne []. Dla każdego tworzy podwójne [] i myślałem, że zewnętrzna toArray zwróci tablicę tego podwójnego []
Jak mogę to uruchomić?

Odpowiedz

9

Oto jak można to zrobić:

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

To może być rozłożona w sposób następujący:

Pierwszy użyć Arrays.stream stworzyć Stream<Number[]>. Następnie dla każdego Number[] należy utworzyć Stream<Number> i użyć mapToDouble, aby uzyskać DoubleStream, a następnie toArray(), aby uzyskać tablicę double[].

Ostateczne połączenie przekształca tę Stream<double[]> w tablicę double[][].

3

Przede wszystkim forEach jest panel operatorski z typem zwracanej void więc nie można użyć

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

Trzeba map dane do double[] rzędach, a następnie zebrać je w double[][], który prowadzi nas do twój drugi problem od toArray() (ze strumienia obiektów) zwraca tablicę Object[], której nie można zapisać w odwołaniu double[][]. Trzeba użyć

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

która będzie zwracać prawidłowy typ danych, dzięki czemu można używać

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

lub jego krótszą wersję

toArray(double[][]::new) 

Oto jak kod może wyglądać następująco:

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

put:

[1.0, 2.0, 3.0] 
[4.0, 5.0, 6.0] 
[7.0, 8.0, 9.0] 
Powiązane problemy