Collections Fortgeschritten

Zwei Aggregationen in einem einzigen Stream-Durchlauf berechnen.

✕ 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.

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
Collectors.teeing()
Verfügbar

Weitgehend verfügbar seit JDK 12 (März 2019)

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.

Teilen 𝕏 🦋 in