22 Stimmen

Die Verwendung von Streams mit primitiven Datentypen und den entsprechenden Wrappern

Beim Herumspielen mit der Java8 Streams-API bin ich auf Folgendes gestoßen:

Um ein Array von primitiven Wrapper-Klasse-Objekten in einen Stream umzuwandeln, muss ich einfach Stream.of(array) aufrufen. Aber um ein Array von primitiven Datentypen umzuwandeln, muss ich .of(array) von der entsprechenden Wrapper (Klasse) Stream-Klasse aufrufen (<-- das klingt albern).

Ein Beispiel:

final Integer[] integers = {1, 2, 3};
final int[]     ints     = {1, 2, 3};

Stream.of(integers).forEach(System.out::println); //Das funktioniert einwandfrei

Stream.of(ints).forEach(System.out::println);     //Das funktioniert nicht

IntStream.of(ints).forEach(System.out::println);  //Muss IntStream anstelle von Stream verwenden

Meine Frage(n): Warum ist das so? Korreliert dies z.B. mit dem Verhalten von Arrays.asList(), das auch nur für Wrapper-Klassen-Arrays funktioniert?

29voto

Honza Zidek Punkte 8069

Das Java 8 Stream-Framework verfügt über eine generische Stream für Objekte als Elemente und drei primitive Streams IntStream, LongStream, DoubleStream für die drei Hauptprimitive. Wenn Sie mit Primitiven arbeiten, verwenden Sie eines dieser letzten, in Ihrem Fall IntStream.

Siehe das Bild:

Bildbeschreibung hier eingeben

Was dahinter steckt:

  1. Java Generics können nicht mit primitiven Typen arbeiten: Es ist nur möglich, List und Stream zu haben, aber nicht List und Stream

  2. Als das Java Collections-Framework eingeführt wurde, wurde es nur für Klassen eingeführt, sodass Sie, wenn Sie eine List von ints haben möchten, sie (jedes einzelne Element!) in Integers verpacken müssen. Das ist teuer!

  3. Als das Java Streams-Framework eingeführt wurde, entschied man sich, dieses Overhead zu umgehen und parallel zu den "klassenorientierten" Streams (die den Generics-Mechanismus verwenden) wurden drei zusätzliche Sets aller Bibliotheksfunktionen eingeführt, die speziell für die wichtigsten primitiven Typen: int, long, double konzipiert sind.

Übrigens haben sie dasselbe mit den vordefinierten funktionalen Schnittstellen im java.util.function-Paket gemacht, so haben Sie Predicate, IntPredicate, DoublePredicate und LongPredicate.

Und hier finden Sie auch eine großartige Erklärung: https://stackoverflow.com/a/22919112/2886891

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X