Collectors.teeing()
Oblicz dwa agregaty w jednym przebiegu strumienia.
Porównanie kodu
✕ 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
)
);
Widzisz problem z tym kodem? Daj nam znać.
Dlaczego nowoczesne podejście wygrywa
Jeden przebieg
Przetwarzasz strumień raz zamiast dwa razy.
Kompozycyjność
Możesz połączyć dowolne dwa kolektory funkcją scalającą.
Niemutowalny wynik
Wynik można od razu scalić do rekordu lub obiektu wartości.
Stare podejście
Dwa przebiegi
Nowoczesne podejście
teeing()
Od JDK
12
Poziom trudności
Średniozaawansowany
Wsparcie JDK
Collectors.teeing()
Dostępne
Szeroko dostępne od JDK 12 (marzec 2019)
Jak to działa
Collectors.teeing() przekazuje każdy element do dwóch kolektorów downstream i scala wyniki. Dzięki temu nie trzeba przetwarzać danych dwa razy ani używać mutowalnego akumulatora.
Powiązana dokumentacja