0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Обработка коллекций через стримы в основном заканчивается двумя вариантами:</p>
1
<p>Обработка коллекций через стримы в основном заканчивается двумя вариантами:</p>
2
<ul><li>Из стрима формируется список через toList()</li>
2
<ul><li>Из стрима формируется список через toList()</li>
3
<li>Стрим сворачивается в какое-то значение через reduce()</li>
3
<li>Стрим сворачивается в какое-то значение через reduce()</li>
4
</ul><p>Второй случай распадается на различные варианты свертки, некоторые из которых встречаются очень часто. Чтобы не делать каждый раз одно и тоже, эти варианты сверток были реализованы в утилитарном классе Collectors в виде статических методов. В этом уроке мы рассмотрим эти методы.</p>
4
</ul><p>Второй случай распадается на различные варианты свертки, некоторые из которых встречаются очень часто. Чтобы не делать каждый раз одно и тоже, эти варианты сверток были реализованы в утилитарном классе Collectors в виде статических методов. В этом уроке мы рассмотрим эти методы.</p>
5
<p>Общий принцип работы этих методов такой. В конце цепочки вызывается метод collect(), куда передается конкретный коллектор. Пример подсчета количества элементов стрима:</p>
5
<p>Общий принцип работы этих методов такой. В конце цепочки вызывается метод collect(), куда передается конкретный коллектор. Пример подсчета количества элементов стрима:</p>
6
<h2>Агрегирующие функции</h2>
6
<h2>Агрегирующие функции</h2>
7
<p>Классическая свертка это разнообразные функции агрегации данных, такие как поиск суммы, минимального, максимального и среднего.</p>
7
<p>Классическая свертка это разнообразные функции агрегации данных, такие как поиск суммы, минимального, максимального и среднего.</p>
8
<p>Метод summingInt() принимает на вход один параметр, с помощью которого извлекается значение из элемента коллекции. В нашем случае мы уже работаем с нужным значением, поэтому используется метод Integer.intValue(), который возвращает это же число. В случае использования объектов необходимость такой реализации очевиднее:</p>
8
<p>Метод summingInt() принимает на вход один параметр, с помощью которого извлекается значение из элемента коллекции. В нашем случае мы уже работаем с нужным значением, поэтому используется метод Integer.intValue(), который возвращает это же число. В случае использования объектов необходимость такой реализации очевиднее:</p>
9
<p>Точно так же мы можем посчитать среднюю зарплату.</p>
9
<p>Точно так же мы можем посчитать среднюю зарплату.</p>
10
<p>Для подсчета минимального и максимального понадобится добавить обертку в виде метода Comparator, который делает необходимое сравнение.</p>
10
<p>Для подсчета минимального и максимального понадобится добавить обертку в виде метода Comparator, который делает необходимое сравнение.</p>
11
<h2>Конкатенация</h2>
11
<h2>Конкатенация</h2>
12
<p>Результат стрима можно преобразовать в строку с помощью Collectors.joining().</p>
12
<p>Результат стрима можно преобразовать в строку с помощью Collectors.joining().</p>
13
<p>При необходимости можно указать символы для оборачивания получившейся строки.</p>
13
<p>При необходимости можно указать символы для оборачивания получившейся строки.</p>
14
<h2>Группировка</h2>
14
<h2>Группировка</h2>
15
<p>Самый интересный вариант использования Collectors это группировка значений коллекции по каким-то признакам. Если предположить что у нас есть список сотрудников, то мы можем сгруппировать его по подразделению в котором они работают. На выходе получится Map.</p>
15
<p>Самый интересный вариант использования Collectors это группировка значений коллекции по каким-то признакам. Если предположить что у нас есть список сотрудников, то мы можем сгруппировать его по подразделению в котором они работают. На выходе получится Map.</p>
16
<p>Существует и более сложная версия группировки, в которой к получившейся группе применяется дополнительная свертка. Например так можно посчитать количество слов в тексте. Ниже пример этого кода, в котором для простоты текст уже разбит на список слов.</p>
16
<p>Существует и более сложная версия группировки, в которой к получившейся группе применяется дополнительная свертка. Например так можно посчитать количество слов в тексте. Ниже пример этого кода, в котором для простоты текст уже разбит на список слов.</p>
17
<p>Как работает этот код:</p>
17
<p>Как работает этот код:</p>
18
<ul><li>Так как в нашем списке обычные слова, а не объекты, лямбда имеет такой вид word -> word.</li>
18
<ul><li>Так как в нашем списке обычные слова, а не объекты, лямбда имеет такой вид word -> word.</li>
19
<li>Вторым параметром в Collectors.groupingBy() передается другой метод коллектора, который выполняется независимо для каждой получившейся группы. Результат этой свертки становится значением в результирующем Map. В примере выше, вместо списка слов мы получаем числовое значение.</li>
19
<li>Вторым параметром в Collectors.groupingBy() передается другой метод коллектора, который выполняется независимо для каждой получившейся группы. Результат этой свертки становится значением в результирующем Map. В примере выше, вместо списка слов мы получаем числовое значение.</li>
20
</ul><h2>Партицирование</h2>
20
</ul><h2>Партицирование</h2>
21
<p>Партицирование, это вариант свертки, в котором список значений делится на две группы по заданному условию. Выполняется с помощью метода Collectors.partitioningBy().</p>
21
<p>Партицирование, это вариант свертки, в котором список значений делится на две группы по заданному условию. Выполняется с помощью метода Collectors.partitioningBy().</p>
22
22