Как выполнить группировку данных с помощью Stream API?

Stream API — инструмент Java для обработки коллекций группировка выполняется методом Collectors.groupingBy() метод получает функцию классификации (keyMapper) результатом становится Map с ключами и перечнями элементов…

Короткий ответ

Что ответить на собеседовании

Stream API — инструмент Java для обработки коллекций группировка выполняется методом Collectors.groupingBy() метод получает функцию классификации (keyMapper) результатом становится Map с ключами и перечнями элементов поддерживаются downstream-коллекторы, например для подсчёта или усреднения подходит для категоризации и эффективного выполнения агрегаций помогает создавать чистый, декларативный и удобный для чтения код

Подробный разбор

Ответ с пояснениями

Как выполнить группировку данных с помощью 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, обработки логов и решения аналогичных задач. Он помогает создавать лаконичный, декларативный и простой в сопровождении код.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку