Ein Überblick über die neuen anpassbaren Stream-Operatoren im java.util.stream.Gatherers-Interface von Java 22
Eine Einführung in Stream-Gatherers
Java 22 hat mit der Einführung von Stream-Gatherers, die durch JEP 461 ermöglicht wurden, einen neuen Mechanismus zur Manipulation von Datenströmen vorgestellt. Diese Neuerung erlaubt es Entwicklern, benutzerdefinierte Zwischenoperationen zu erstellen, die komplexe Operationen vereinfachen. Obwohl Stream-Gatherers auf den ersten Blick etwas komplex erscheinen, werden sie schnell zu einer offensichtlichen und willkommenen Ergänzung der Stream-API, insbesondere bei spezifischen Arten von Stream-Manipulationen.
Die Stream-API und Stream-Gatherers
Java-Streams modellieren dynamische Sammlungen von Elementen. Laut Spezifikation ist ein Stream „eine lazy berechnete, potenziell unbegrenzte Sequenz von Werten“. Dies bedeutet, dass Entwickler Datenströme endlos konsumieren und darauf operieren können. Man kann sich dies wie das Sitzen an einem Fluss vorstellen, bei dem das Wasser kontinuierlich vorbeifließt und man nie auf ein Ende wartet. Entwickler beginnen einfach mit der Arbeit an den Streams und beenden diese, wenn sie fertig sind.
Was Sie mit Stream-Gatherers tun können
Ein einfaches Beispiel zeigt, wie mit der filter
-Methode ein Array aller geraden Zahlen erstellt werden kann:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
numbers.stream().filter(number -> number % 2 == 0).toArray(); // Ergebnis: { 2, 4, 6, 8, 10 }
Hier verwandelt man ein Array von Ganzzahlen in einen Stream und wendet einen Filter an, der nur die Zahlen zurückgibt, deren Division durch zwei keinen Rest lässt. Der Aufruf von toArray()
ist der terminale Aufruf.
Die eingebauten Methoden von Stream-Gatherers
Das java.util.stream.Gatherers-Interface bietet eine Reihe von eingebauten Funktionen, die es Entwicklern ermöglichen, benutzerdefinierte Zwischenoperationen zu erstellen. Nachfolgend sind einige dieser Methoden und deren Anwendung beschrieben.
Die windowFixed-Methode
Die windowFixed
-Methode ermöglicht es, Elemente in festen Gruppen zu sammeln. Ein Beispielcode:
Stream.iterate(1, i -> i + 1)
.gather(Gatherers.windowFixed(3))
.limit(3)
.collect(Collectors.toList());
Dies führt zu folgendem Ergebnis:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Mit windowFixed
bewegt man einen Rahmen über den Stream, um Schnappschüsse zu machen.
Die windowSliding-Methode
Die windowSliding
-Methode funktioniert ähnlich wie windowFixed()
, beginnt jedoch jedes Fenster mit dem nächsten Element im Quellarray. Ein Beispielcode:
Stream.iterate(1, i -> i + 1)
.gather(Gatherers.windowSliding(3))
.limit(3)
.collect(Collectors.toList());
Die Ausgabe ist:
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
Im Gegensatz zu windowFixed
enthält jedes Teilarray in windowSliding
das letzte Element des vorherigen Teilarrays.
Die Gatherers.fold-Methode
Die Gatherers.fold
-Methode ist eine verfeinerte Version der Stream.reduce
-Methode. Ein Beispiel für die Verwendung von fold
:
Stream.of("apple","banana","cherry","date")
.gather(Gatherers.fold(() -> "",
(acc, element) -> acc.isEmpty() ? element : acc + ", " + element))
.findFirst()
.get();
Die gleiche Arbeit wird von reduce
erledigt:
String result = Stream.of("apple", "banana", "cherry", "date")
.reduce("", (acc, element) -> acc.isEmpty() ? element : acc + ", " + element);
Mit fold
kann man eine Funktion definieren, anstelle eines festen Anfangswertes.
Die Gatherers.scan-Methode
Die scan
-Methode akkumuliert die Elemente zu einem einzelnen Element anstelle eines Arrays. Ein Beispiel:
Stream.of(1,2,3,4,5)
.gather(Gatherers.scan(() -> "", (string, number) -> string + number))
.toList();
Die Ausgabe ist:
["1", "12", "123", "1234", "12345"]
Mit scan
kombiniert man die Stream-Elemente kumulativ.
Praktische Anwendungen von Stream-Gatherers
Die neuen Methoden von Stream-Gatherers bieten zahlreiche Möglichkeiten für komplexe Datenmanipulationen. Beispielsweise kann die windowFixed
-Methode in Echtzeitanwendungen zur Überwachung von Datenströmen verwendet werden, bei denen Ereignisse in festen Intervallen analysiert werden müssen. Die windowSliding
-Methode eignet sich gut für Anwendungen, bei denen eine kontinuierliche Analyse mit sich überschneidenden Datensätzen erforderlich ist.
Vergleich von Stream-Gatherers mit bestehenden Methoden
Im Vergleich zu den bestehenden Methoden der Stream-API bieten Stream-Gatherers eine flexiblere und leistungsfähigere Möglichkeit, benutzerdefinierte Zwischenoperationen zu erstellen. Während Methoden wie reduce
und collect
bereits mächtig sind, erweitern Gatherers diese Funktionalität und machen sie zugänglicher und einfacher zu handhaben.
Fazit
Stream-Gatherers in Java 22 schließen einige langjährige Lücken in der Stream-API und erleichtern es Entwicklern, funktionale Java-Programme zu erweitern und anzupassen. Mit ihren neuen Methoden bieten sie eine leistungsstarke Möglichkeit, komplexe Datenmanipulationen durchzuführen und ermöglichen eine flexiblere und intuitivere Handhabung von Streams.