Ein Überblick über neue Stream-Gatherers in Java 22

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.

Post teilen:

Brauchen Sie technische Unterstützung?

Ich stehe Ihnen zur Verfügung, um Ihnen bei allen technischen Problemen zu helfen. Kontaktieren Sie mich jetzt!

Verwandte Beiträge