2016-04-23 11 views
0

Ich habe eine ArrayList<ArrayList<Integer>> C und ich möchte Stream verwenden, um es in eine einfache 2D-Array abzubilden. Mein erster Schritt war, Diagramme in eine Arraylist von int Arrays und ich kam mit diesem:Java 8 Funktion definiert in stream(). Map()

this.C = C.stream().map(new Function<ArrayList<Integer>, int[]>(){ 
      public int[] apply(ArrayList<Integer> person) { 
       return new int[0]; 
      } 
     }) 

Aber es sagt mir, dass map(Function<? super ArrayList<Integer>,? extends R>) kann nicht auf meinen Function<ArrayList<Integer>,int[]> angewandt werden. Ich kann nicht herausfinden, welcher der Parameter das Problem hier ist und warum.

+0

Sie sollten mit diesen Konvertierungen vorsichtig sein, weil Ihre Arraylisten in Arraylist unterschiedliche Größen haben können. – Everv0id

Antwort

1

Java 8 verwendet Typinferenz. Die Typen werden durch die Verwendung des Codes bestimmt. Die Art des Ausdrucks hat

Stream<int[]> c = .... 

sein, wenn Ihr this.C jede andere Art ist, wird die Typinferenz verwirrt und davon ausgehen, das Problem in der ersten Art ist, könnte es nicht, eher als die Art der Bestimmung Der Ausdruck stimmt nicht mit dem Typ überein, dem Sie ihn zuweisen.

public static int[][] to2d(List<? extends List<Integer>> matrix) { 
    return matrix.stream() 
        // convert each List<Integer> to an int[] 
        .map(a -> a.stream().mapToInt(i -> i).toArray()) 
        // convert the int[]s to an int[][] 
        .toArray(int[][]::new); 
} 
+0

Wow, ich merke nicht einmal, dass ich versucht habe, es zurück zu C: D zu geben Danke auch für das Beispiel. – seMikel

+0

Es ist die Typ-Inferenz, die bedeutet, dass die Fehlermeldung nicht direkt auf den Fehler bezogen ist. –

+0

Könnten Sie auch erklären, warum 'int [] G = B.stream(). Map (Integer :: intValue) .toArray (int [] :: new);' verursacht auch ein Typ-Inferenz-Problem bei 'int [ ] :: neu? Wo B ist eine 'ArrayList ' – seMikel