Получить доступ

Как одним коллектором получить «количество элементов в каждой группе»?

MiddleЛямбды и Stream API
Коротко

groupingBy(classifier, counting()) — downstream-коллектор counting сворачивает каждую группу в число (Long).

  • Другие downstream: summingInt, averagingDouble, mapping, maxBy, toSet
  • Вложенная группировка: groupingBy(a, groupingBy(b))
  • partitioningBy — разбиение на две группы по условию

А ещё counting возвращает Long; нужен Integer — collectingAndThen или summingInt(e -> 1)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Сила groupingBy во втором аргументе — downstream-коллекторе, который сворачивает каждую группу дальше: counting() (размер), mapping/summingInt/averagingInt (агрегаты), maxBy/minBy. Так одной строкой получают «сотрудников по отделам» (counting) или «среднюю зарплату по отделам» — вложенная свёртка вместо ручного цикла.

Пример

Map<Dept, Long> count = emps.stream()
    .collect(groupingBy(Emp::dept, counting()));
Map<Dept, Double> avgSalary = emps.stream()
    .collect(groupingBy(Emp::dept, averagingInt(Emp::salary)));

Что хотят услышать

  • groupingBy с counting.
  • Идея downstream-коллекторов.

Частые ошибки

  • Искать несуществующий size() в toMap.
  • Считать, что groupingBy умеет только Map<K,List<V>>.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓groupingBy(classifier, counting()) — downstream-коллектор counting() сворачивает каждую группу в её размер
  • ✗toMap(classifier, size())
  • ✗partitioningBy(classifier).count()
  • ✗reduce(0, (a,b) -> a+1) по всему стриму

Что спросят дальше

  • Какие ещё downstream-коллекторы есть?
  • Чем partitioningBy отличается от groupingBy?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем