2016-05-16 9 views
6

In this Frage wurde bereits beantwortet, dass beide Ausdrücke gleich sind, aber in diesem Fall produzieren sie unterschiedliche Ergebnisse. Für eine gegebene int[] scores, warum funktionierts:Arrays.stream (Array) vs Arrays.asList (Array) .stream()

Arrays.stream(scores) 
     .forEach(System.out::println); 

... aber nicht:

Arrays.asList(scores).stream() 
     .forEach(System.out::println); 

Soweit ich .stream() wissen kann auf jeder Sammlung genannt werden, die auf jeden Fall sind Listen. Das zweite Code-Snippet gibt nur einen Stream zurück, der das Array als Ganzes anstelle der Elemente enthält.

Antwort

13

Das angezeigte Verhalten ist nicht spezifisch für Stream s. Arrays.asList(scores) gibt List<int[]> zurück, wenn Sie eine int[] übergeben, da ein generischer Typparameter nicht durch einen primitiven Typ ersetzt werden kann. Wenn Sie asList(T... a) aufrufen, verwendet der Compiler daher int[] anstelle von T.

Wenn Sie scores-Integer[] ändern, werden Sie die Ausgabe erhalten Sie erwarten (das heißt Arrays.asList(scores) wird wieder eine List<Integer>).

+0

Ich sehe mit streamen. Es ist einfach komisch, weil ich mich erinnere, dass ich in der Vergangenheit so etwas gemacht habe und es funktioniert hat. Hätte es funktioniert, wenn ich die Liste im Voraus so erklärt hätte: 'List scoresAsList = new ArrayList <> (scores);'? – AdHominem

+3

@AdHominem Das würde nicht funktionieren, da Sie kein Array an einen 'ArrayList'-Konstruktor übergeben können. Sie können nur eine Sammlung übergeben. – Eran

+0

Als eine Nebenbemerkung, 'Stream.of (scores) .forEach (System.out :: println);' tut das gleiche wie 'Arrays.asList (scores) .stream(). ForEach (System.out :: println; '... – Holger

7

Der Grund, warum das zweite Code-Snippet nicht funktioniert, ist, dass es in Java keine List<int> gibt. Deshalb produziert Arrays.asList(scores) nicht, was Sie erwarten.

Die Umstellung von int[] auf Integer[] würde dieses Problem in dem Sinne beheben, dass die beiden Codeteile identische Ergebnisse liefern würden. Ihr Code wäre jedoch weniger effizient, da alle int s Boxed wären.

In der Tat ist Effizienz der Grund hinter Überlastungen von stream für primitive Arrays. Ihr Anruf Arrays.stream(scores) wird zu stream(int[] array) geroutet, IntStream Objekt produzierend. Jetzt können Sie .forEach(System.out::println) anwenden, die println(int) aufruft, wieder Boxen vermeiden.

+1

Betet für Project Valhalla dann: D –

+0

@ java8.being: seit dem Schreiben eines Wrappers' List' für ein 'int []' ist ungefähr zehn Zeilen Code und für das Streaming, 'Arrays. stream (scores) 'schon funktioniert, ich sehe nicht den Punkt, für etwas zu beten, für das wir nicht einmal wissen, was und wie es sich über dieses Thema ändern wird ... – Holger

+0

@Holger Ich meinte für diese Zeile:' Der Grund der Das zweite Code-Snippet funktioniert nicht, weil es in Java keine Liste gibt. –

0

Arrays.asList erwartet Arrays von Objekt nicht Arrays von Primitiven. Es kompromittiert nicht zur Kompilierzeit, da Arrays von Primitiven ein Objekt sind.

Es kann ein Objekt als Liste nehmen, aber was ist in diesem Objekt (Arrays von Primitiven ist ein Objekt) kann nicht in Liste konvertiert werden.

Arrays primitiver kann konvertieren IntStream, DoubleStream und LongStream

wie diese

double[] doubleArray = {1.1,1.2,1.3}; 

DoubleStream.of(doubleArray).forEach(System.out::println); 


int[] intArray = {1,2,3,4,5,6}; 

IntStream.of(intArray).forEach(System.out::println); 


long[] longArray = {1L,2L,3L}; 

LongStream.of(longArray).forEach(System.out::println); 
+0

Was ist los mit meiner Antwort? Am wenigsten solltest du kommentieren. –

+0

Es hilft sicher, wie int [] Score in Stream konvertiert werden kann. –

+0

viel besser jetzt +1 – Hulk