Primitive Typ-Streams in Java 8

1. Einleitung

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 Sequenzen von Elementen bequem und effizienter zu verarbeiten, indem eine deklarative API bereitgestellt wird.

2. Primitive Streams

Streams arbeiten hauptsächlich mit Sammlungen von Objekten und nicht mit primitiven Typen.

Glücklicherweise enthält die Standardbibliothek drei primitivspezialisierte Implementierungen: IntStream , LongStream und DoubleStream , um die Arbeit mit den drei am häufigsten verwendeten primitiven Typen - int, long und double - zu ermöglichen .

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. Arithmetische Operationen

Beginnen wir mit einigen interessanten Methoden für häufig verwendete arithmetische Operationen wie Min , Max , Summe und Durchschnitt:

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 unseren IntStream mit java.util.Arrays.stream (int []) erstellt und dann mit der min () -Methode die niedrigste Ganzzahl als java.util.OptionalInt abgerufen und schließlich getAsInt () aufgerufen , um den int- Wert abzurufen .

Eine andere Möglichkeit, einen IntStream zu erstellen, ist die Verwendung von IntStream.of (int…) . Die max () -Methode gibt die größte Ganzzahl zurück:

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

Weiter - um die Summe der Ganzzahlen zu erhalten, rufen wir einfach die sum () -Methode auf und müssen getAsInt () nicht verwenden, da das Ergebnis bereits als int- Wert zurückgegeben wird:

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

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

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

4. Reichweite

Wir können auch einen IntStream 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 mit ganzzahligen Werten zu erstellen: range () und rangeClosed () .

Der Unterschied besteht darin, dass das Ende von range () exklusiv ist, während es in rangeClosed () enthalten ist .

Bereichsmethoden sind nur für IntStream und LongStream verfügbar .

Wir können den Bereich 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 boxed () -Methode verwenden:

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

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

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

Wir können immer die Methoden mapToXxx und flatMapToXxx verwenden, um primitive Streams zu erstellen.

6. Fazit

Java Streams ist eine sehr mächtige Ergänzung 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 Sie Codebeispiele auf GitHub.