Stream API — инструмент Java для обработки коллекций группировка выполняется методом Collectors.groupingBy() метод получает функцию классификации (keyMapper) результатом становится Map с ключами и перечнями элементов поддерживаются downstream-коллекторы, например для подсчёта или усреднения подходит для категоризации и эффективного выполнения агрегаций помогает создавать чистый, декларативный и удобный для чтения код
Как выполнить группировку данных с помощью Stream API?
Stream API — инструмент Java для обработки коллекций группировка выполняется методом Collectors.groupingBy() метод получает функцию классификации (keyMapper) результатом становится Map с ключами и перечнями элементов…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Как выполнить группировку данных с помощью Stream API?
- Stream API — инструмент Java для обработки коллекций
- группировка выполняется методом Collectors.groupingBy()
- метод получает функцию классификации (keyMapper)
- результатом становится Map с ключами и перечнями элементов
- поддерживаются downstream-коллекторы, например для подсчёта или усреднения
- подходит для категоризации и эффективного выполнения агрегаций
- помогает создавать чистый, декларативный и удобный для чтения код
Пример:
Map<Category, List<Item>> grouped = items.stream()
.collect(Collectors.groupingBy(Item::getCategory));
Развёрнутый ответ
Основной ответ
В Java для группировки с использованием Stream API применяется метод Collectors.groupingBy(). Он распределяет элементы коллекции по определённому признаку, который задаётся функцией классификации (classifier function). В результате возвращается Map: ключами становятся значения, полученные от классификатора, а значениями — списки элементов, относящихся к каждому ключу.
Сначала коллекция преобразуется в стрим, после чего к нему применяется операция группировки с функцией классификации. Например, так можно распределить объекты по значению одного из их полей. Такой вариант позволяет декларативно агрегировать данные и обходиться без ручного написания циклов.
Что важно учитывать
- Помимо функции классификации, Collectors.groupingBy принимает
Collector, предназначенный для более сложной агрегации. С его помощью можно, например, подсчитать число элементов черезCollectors.counting()или выполнить суммирование; - В Java 8-11 это стандартный подход к группировке. Начиная с Java 12 доступно удобное API для additional downstream collectors, с помощью которого можно организовывать вложенную группировку на нескольких уровнях;
- При использовании стандартных методов группировка возвращает неизменяемую структуру Map. При необходимости можно указать конкретную реализацию Map, например
LinkedHashMap, чтобы сохранить порядок элементов.
Практический пример
Предположим, имеется список сотрудников List<Employee>, который требуется распределить по отделам. Для этого используем:
Map<String, List<Employee>> grouped = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
В результате получится карта: названием отдела будет ключ, а значением — список сотрудников, относящихся к этому отделу. Чтобы получить количество сотрудников для каждого отдела:
Map<String, Long> countByDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting()));
Этот приём часто применяют для агрегации данных из БД или CSV, обработки логов и решения аналогичных задач. Он помогает создавать лаконичный, декларативный и простой в сопровождении код.