· Michael Stöckler · Development  · 1 min read

Java 24: Stream Gatherers - Die Revolution der Stream-Verarbeitung

Die neue Java-Version bringt mit Stream Gatherers eine mächtige Erweiterung der Stream API, die Entwicklern völlig neue Möglichkeiten der Datenverarbeitung eröffnet.

Die neue Java-Version bringt mit Stream Gatherers eine mächtige Erweiterung der Stream API, die Entwicklern völlig neue Möglichkeiten der Datenverarbeitung eröffnet.

Eine lang erwartete Ergänzung

Seit der Einführung der Stream API in Java 8 mussten Entwickler mit einem fixen Set von intermediären Operationen arbeiten. Während terminale Operationen durch collect(Collector) erweiterbar waren, fehlte eine entsprechende Möglichkeit für Zwischenoperationen. Mit JDK 24 ändert sich das grundlegend durch die Einführung von Stream Gatherers.

Was sind Stream Gatherers?

Stream Gatherers sind das Pendant zu Collectors für intermediäre Operationen. Sie werden über die neue Methode Stream.gather(Gatherer) eingebunden und ermöglichen es, Streams flexibel zu transformieren. Ein Gatherer kann dabei:

  • Eins-zu-eins, eins-zu-viele, viele-zu-eins oder viele-zu-viele Transformationen durchführen
  • Zustand zwischen Elementverarbeitungen speichern
  • Die Verarbeitung vorzeitig beenden (Short-Circuit)
  • Optional parallel ausgeführt werden

Mitgelieferte Implementierungen

Das JDK liefert bereits einige nützliche Gatherers in der Klasse java.util.stream.Gatherers:

GathererBeschreibung
foldAggregiert Elemente inkrementell und emittiert das Ergebnis am Ende
mapConcurrentFührt parallele Element-Transformationen durch
scanWendet eine Funktion auf den aktuellen Zustand und das aktuelle Element an
windowFixedGruppiert Elemente in Listen fester Größe
windowSlidingErstellt überlappende Fenster fester Größe

Implementierung eigener Gatherers

Ein Gatherer wird durch vier Funktionen definiert:

  1. Initializer: Erstellt ein Objekt für den privaten Zustand
  2. Integrator: Verarbeitet neue Elemente und emittiert Ergebnisse
  3. Combiner (optional): Ermöglicht parallele Verarbeitung
  4. Finisher: Wird am Ende aufgerufen und kann finale Elemente emittieren

Praktisches Beispiel

var result = Stream.of("foo", "bar", "baz", "quux")
.gather(distinctByLength())
.toList();
Back to Blog

Related Posts

View All Posts »
Flexible Konstruktorkörper in Java 24

Flexible Konstruktorkörper in Java 24

Java 24 bringt mit flexiblen Konstruktorkörpern eine lang erwartete Verbesserung in der Objekterstellung. Dieses Feature, nun in der dritten Preview, verspricht robustere und lesbarere Konstruktoren und steht möglicherweise kurz vor der Finalisierung.

Java 24: Primitive Types in Patterns, instanceof and switch

Java 24: Primitive Types in Patterns, instanceof and switch

Java 24 erweitert das Pattern Matching mit Unterstützung primitiver Typen und revolutioniert damit die Typisierung und Verarbeitung von Daten. Entwickler können nun Primitive in instanceof, switch und Patterns verwenden und gewinnen dadurch mehr Flexibilität und Lesbarkeit bei Typumwandlungen.

Blocking vs Non-Blocking I/O

Blocking vs Non-Blocking I/O

Nach unserem Blick auf die Grenzen des Thread-per-Request Modells tauchen wir tief in die Welt des I/O ein. Verstehen Sie den fundamentalen Unterschied zwischen blockierendem und nicht-blockierendem I/O und lernen Sie, wie moderne Java-Anwendungen mit NIO und Event Loops diese Konzepte nutzen.Mit praktischen Beispielen und Performance-Messungen zeigen wir, wie der Wechsel von blockierendem zu nicht-blockierendem I/O die in Teil 1.1 diskutierten Skalierungsprobleme adressiert.

Die Herausforderung der Skalierung

Die Herausforderung der Skalierung

Ihre Java-Anwendung wächst und plötzlich brechen die Response-Zeiten ein? Was vor 25 Jahren als "C10k-Problem" die Entwicklerwelt beschäftigte, ist heute aktueller denn je. Erfahren Sie, warum der klassische Thread-pro-Request Ansatz an seine Grenzen stößt und wie moderne Architekturmuster Abhilfe schaffen.