Collectors.teeing()
Вычисление двух агрегаций за один проход по потоку.
Сравнение кода
✕ 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
)
);
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Один проход
Обработать поток один раз вместо двух.
Комбинируемый
Соединить два произвольных Collector с функцией слияния.
Неизменяемый результат
Сразу объединить в Record или Value-Object.
Старый подход
Два прохода
Современный подход
teeing()
Начиная с JDK
12
Сложность
Средний
Поддержка JDK
Collectors.teeing()
Доступно
Широко доступно начиная с JDK 12 (март 2019)
Как это работает
Collectors.teeing() направляет каждый элемент в два дочерних Collector и объединяет результаты. Это позволяет избежать двукратного обхода данных или использования изменяемого аккумулятора.
Связанная документация
Доказательство