Primitive Type Streams in Java 8

Grundtyp-Streams in Java 8

1. Einführung

Die Stream-API war eine der wichtigsten Funktionen, die in Java 8 hinzugefügt wurden.

Kurz gesagt, die API ermöglicht es uns, Sammlungen und andere Folgen von Elementen -conveniently and more efficiently - zu verarbeiten, indem eine deklarative API bereitgestellt wird.

2. Primitive Streams

Streams arbeiten hauptsächlich mit Objektgruppen und nicht mit primitiven Typen.

Glücklicherweise enthält die Standardbibliothek drei primitivspezialisierte Implementierungen, um eine Möglichkeit zu bieten, mit den drei am häufigsten verwendeten primitiven Typen zu arbeiten -int, long unddouble:IntStream,LongStream, und DoubleStream.

Primitive Streams sind hauptsächlich aufgrund des Box-Overheads begrenzt, und weil das Erstellen spezialisierter Streams für andere Primitive in vielen Fällen nicht so nützlich ist.

3. Rechenoperationen

Beginnen wir mit einigen interessanten Methoden für häufig verwendete arithmetische Operationen wiemin,max,sum undaverage:

int[] integers = new int[] {20, 98, 12, 7, 35};
int min = Arrays.stream(integers)
  .min()
  .getAsInt(); // returns 7

Lassen Sie uns nun den obigen Code-Ausschnitt durchgehen, um zu verstehen, was los ist.

Wir haben unsereIntStream mitjava.util.Arrays.stream(int[]) erstellt und dann die Methodemin() verwendet, um die niedrigste Ganzzahl alsjava.util.OptionalInt zu erhalten, und schließlichgetAsInt() aufgerufen, um dieintzu erhalten ) s Wert.

Eine andere Möglichkeit, einIntStream zu erstellen, ist die Verwendung vonIntStream.of(int…). Die Methodemax() gibt die größte Ganzzahl zurück:

int max = IntStream.of(20, 98, 12, 7, 35)
  .max()
  .getAsInt(); // returns 98

Als nächstes - um die Summe der ganzen Zahlen zu erhalten, rufen wir einfach die Methodesum()auf und müssengetAsInt()nicht verwenden, da das Ergebnis bereits als Wert vonintzurückgegeben wird:

int sum = IntStream.of(20, 98, 12, 7, 35).sum(); // returns 172

Wir rufen die Methodeaverage() auf, um den Durchschnitt der ganzzahligen Werte zu erhalten, und wie wir sehen können, sollten wirgetAsDouble() verwenden, da sie einen Wert vom Typdouble zurückgibt.

double avg = IntStream.of(20, 98, 12, 7, 35)
  .average()
  .getAsDouble(); // returns 34.4

4. Angebot

Wir können auch einIntStream basierend auf einem Bereich erstellen:

int sum = IntStream.range(1, 10)
  .sum(); // returns 45
int sum = IntStream.rangeClosed(1, 10)
  .sum(); // returns 55

Wie das obige Codefragment zeigt, gibt es zwei Möglichkeiten, einen Bereich von ganzzahligen Wertenrange() undrangeClosed() zu erstellen.

Der Unterschied besteht darin, dass das Ende vonrange() exklusiv ist, während es inrangeClosed() eingeschlossen ist.

Bereichsmethoden sind nur fürIntStream undLongStream verfügbar.

Wir können range als ausgefallene Form einer for-each-Schleife verwenden:

IntStream.rangeClosed(1, 5)
  .forEach(System.out::println);

Was gut daran ist, sie als Ersatz für jede Schleife zu verwenden, ist, dass wir auch die parallele Ausführung nutzen können:

IntStream.rangeClosed(1, 5)
  .parallel()
  .forEach(System.out::println);

So hilfreich diese ausgefallenen Schleifen auch sind, es ist immer noch besser, die traditionellen for-Schleifen anstelle der funktionalen für einfache Iterationen zu verwenden, da sie in einigen Fällen einfach, lesbar und leistungsfähig sind.

5. Boxen und Unboxing

Es gibt Zeiten, in denen wir primitive Werte in ihre Wrapper-Äquivalente konvertieren müssen.

In diesen Fällen können wir die Methodeboxed()verwenden:

List evenInts = IntStream.rangeClosed(1, 10)
  .filter(i -> i % 2 == 0)
  .boxed()
  .collect(Collectors.toList());

Wir können auch vom Wrapper-Klassen-Stream zum primitiven Stream konvertieren:

// returns 78
int sum = Arrays.asList(33,45)
  .stream()
  .mapToInt(i -> i)
  .sum();

Wir können immer die MethodenmapToXxx undflatMapToXxx verwenden, um primitive Streams zu erstellen.

6. Fazit

Java Streams ist eine sehr mächtige Erweiterung der Sprache. Wir haben hier kaum die Oberfläche primitiver Streams zerkratzt, aber Sie können sie bereits verwenden, um produktiv zu sein.

Und wie immer finden sich Codebeispiele inover on GitHub.