Java: Стримы
Теория: Стандартные методы свертки (Collectors)
Обработка коллекций через стримы в основном заканчивается двумя вариантами:
- Из стрима формируется список через
toList() - Стрим сворачивается в какое-то значение через
reduce()
Второй случай распадается на различные варианты свертки, некоторые из которых встречаются очень часто. Чтобы не делать каждый раз одно и тоже, эти варианты сверток были реализованы в утилитарном классе Collectors в виде статических методов. В этом уроке мы рассмотрим эти методы.
Общий принцип работы этих методов такой. В конце цепочки вызывается метод collect(), куда передается конкретный коллектор. Пример подсчета количества элементов стрима:
Агрегирующие функции
Классическая свертка это разнообразные функции агрегации данных, такие как поиск суммы, минимального, максимального и среднего.
Метод summingInt() принимает на вход один параметр, с помощью которого извлекается значение из элемента коллекции. В нашем случае мы уже работаем с нужным значением, поэтому используется метод Integer.intValue(), который возвращает это же число. В случае использования объектов необходимость такой реализации очевиднее:
Точно так же мы можем посчитать среднюю зарплату.
Для подсчета минимального и максимального понадобится добавить обертку в виде метода Comparator, который делает необходимое сравнение.
Конкатенация
Результат стрима можно преобразовать в строку с помощью Collectors.joining().
При необходимости можно указать символы для оборачивания получившейся строки.
Группировка
Самый интересный вариант использования Collectors это группировка значений коллекции по каким-то признакам. Если предположить что у нас есть список сотрудников, то мы можем сгруппировать его по подразделению в котором они работают. На выходе получится Map.
Существует и более сложная версия группировки, в которой к получившейся группе применяется дополнительная свертка. Например так можно посчитать количество слов в тексте. Ниже пример этого кода, в котором для простоты текст уже разбит на список слов.
Как работает этот код:
- Так как в нашем списке обычные слова, а не объекты, лямбда имеет такой вид
word -> word. - Вторым параметром в
Collectors.groupingBy()передается другой метод коллектора, который выполняется независимо для каждой получившейся группы. Результат этой свертки становится значением в результирующемMap. В примере выше, вместо списка слов мы получаем числовое значение.
Партицирование
Партицирование, это вариант свертки, в котором список значений делится на две группы по заданному условию. Выполняется с помощью метода Collectors.partitioningBy().
Рекомендуемые программы
Завершено
0 / 10

