Collectors.teeing()
Передаёт каждый элемент сразу в два коллектора и объединяет их результаты.
Доступно с: Java 12
Синтаксис
static <T, R1, R2, R> Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| downstream1 | Collector<? super T, ?, R1> | Первый коллектор. |
| downstream2 | Collector<? super T, ?, R2> | Второй коллектор. |
| merger | BiFunction<? super R1, ? super R2, R> | Функция, которая получает оба результата и возвращает итоговый. |
Возвращаемое значение
Collector<T, ?, R>Коллектор с результатом функции merger.
Примеры
Минимум и максимум за один проход:
record Range(int min, int max) {}
void main() {
Range r = Stream.of(7, 3, 9, 4)
.collect(Collectors.teeing(
Collectors.minBy(Integer::compare),
Collectors.maxBy(Integer::compare),
(min, max) -> new Range(min.get(), max.get())));
IO.println(r);
}Результат:
Range[min=3, max=9]Среднее как сумма, делённая на количество:
void main() {
double avg = Stream.of(4, 8, 6)
.collect(Collectors.teeing(
Collectors.summingInt(n -> n),
Collectors.counting(),
(sum, count) -> (double) sum / count));
IO.println(avg);
}Результат:
6.0Примечания
Название — от тройника (tee) в трубах: поток делится на две ветки. Полезен, когда поток нельзя пройти дважды или данные большие. Для простых чисел то же даёт summaryStatistics() у IntStream.
См. также
- Stream.collect() — Собирает элементы потока в коллекцию, строку или другую структуру.
- Collectors.counting() — Сборщик-счётчик; обычно используется внутри `groupingBy()`.
- Collectors.summingInt() — Сборщик, который суммирует числовое поле элементов.
- BiFunction — Функция двух аргументов.
В учебнике
- Коллекторы — Метод collect и класс Collectors — toList, toSet, toMap, joining, counting, summingInt, averagingDouble и ошибка повторяющегося ключа.