Java: Стримы
2026-02-26 18:42 Diff

Обработка коллекций через стримы в основном заканчивается двумя вариантами:

  • Из стрима формируется список через toList()
  • Стрим сворачивается в какое-то значение через reduce()

Второй случай распадается на различные варианты свертки, некоторые из которых встречаются очень часто. Чтобы не делать каждый раз одно и тоже, эти варианты сверток были реализованы в утилитарном классе Collectors в виде статических методов. В этом уроке мы рассмотрим эти методы.

Общий принцип работы этих методов такой. В конце цепочки вызывается метод collect(), куда передается конкретный коллектор. Пример подсчета количества элементов стрима:

Агрегирующие функции

Классическая свертка это разнообразные функции агрегации данных, такие как поиск суммы, минимального, максимального и среднего.

Метод summingInt() принимает на вход один параметр, с помощью которого извлекается значение из элемента коллекции. В нашем случае мы уже работаем с нужным значением, поэтому используется метод Integer.intValue(), который возвращает это же число. В случае использования объектов необходимость такой реализации очевиднее:

Точно так же мы можем посчитать среднюю зарплату.

Для подсчета минимального и максимального понадобится добавить обертку в виде метода Comparator, который делает необходимое сравнение.

Конкатенация

Результат стрима можно преобразовать в строку с помощью Collectors.joining().

При необходимости можно указать символы для оборачивания получившейся строки.

Группировка

Самый интересный вариант использования Collectors это группировка значений коллекции по каким-то признакам. Если предположить что у нас есть список сотрудников, то мы можем сгруппировать его по подразделению в котором они работают. На выходе получится Map.

Существует и более сложная версия группировки, в которой к получившейся группе применяется дополнительная свертка. Например так можно посчитать количество слов в тексте. Ниже пример этого кода, в котором для простоты текст уже разбит на список слов.

Как работает этот код:

  • Так как в нашем списке обычные слова, а не объекты, лямбда имеет такой вид word -> word.
  • Вторым параметром в Collectors.groupingBy() передается другой метод коллектора, который выполняется независимо для каждой получившейся группы. Результат этой свертки становится значением в результирующем Map. В примере выше, вместо списка слов мы получаем числовое значение.

Партицирование

Партицирование, это вариант свертки, в котором список значений делится на две группы по заданному условию. Выполняется с помощью метода Collectors.partitioningBy().