Collectors.teeing()
Zwei Aggregationen in einem einzigen Stream-Durchlauf berechnen.
Code-Vergleich
✕ Java 8
long count = items.stream().count();
double sum = items.stream()
.mapToDouble(Item::price)
.sum();
var result = new Stats(count, sum);
✓ Java 12+
var result = items.stream().collect(
Collectors.teeing(
Collectors.counting(),
Collectors.summingDouble(Item::price),
Stats::new
)
);
Problem mit diesem Code entdeckt? Sag uns Bescheid.
Warum der moderne Weg gewinnt
Einzelner Durchlauf
Den Stream einmal statt zweimal verarbeiten.
Kombinierbar
Zwei beliebige Collectors mit einer Zusammenführungsfunktion verbinden.
Unveränderliches Ergebnis
Direkt in einen Record oder Value-Object zusammenführen.
Alter Ansatz
Zwei Durchläufe
Moderner Ansatz
teeing()
Seit JDK
12
Schwierigkeitsgrad
Fortgeschritten
JDK-Unterstützung
Collectors.teeing()
Verfügbar
Weitgehend verfügbar seit JDK 12 (März 2019)
Wie es funktioniert
Collectors.teeing() sendet jedes Element an zwei nachgelagerte Collectors und fasst die Ergebnisse zusammen. Dadurch wird vermieden, die Daten zweimal zu durchlaufen oder einen veränderbaren Akkumulator zu verwenden.
Zugehörige Dokumentation