Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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)

Параметры

ПараметрТипОписание
downstream1Collector<? super T, ?, R1>Первый коллектор.
downstream2Collector<? super T, ?, R2>Второй коллектор.
mergerBiFunction<? 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 и ошибка повторяющегося ключа.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.