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

Что делает терминальная операция collect?

JuniorЛямбды и Stream APIJava >=8
Ещё спрашивают так:
  • Как сгруппировать элементы стрима?
  • Что такое Collectors?
  • Почему Collectors.toMap бросает исключение?
Коротко

collect — терминальная операция, которая складывает результат конвейера в структуру: список, множество, карту, строку.

  • Готовые сборщики: toList, toSet, toMap, joining, groupingBy, partitioningBy, counting
  • groupingBy заменяет цикл с картой и проверкой ключа одной строкой

А ещё toMap: одинаковые ключи без функции слияния → IllegalStateException, значение null → NPE

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

Подробно

collect(Collector) завершает конвейер и собирает элементы. Способ сборки задают готовые коллекторы из Collectors:

  • toList(), toSet(), toCollection(TreeSet::new);
  • toMap(keyFn, valueFn) — в карту;
  • joining(", ") — склеить строки;
  • groupingBy(classifier) — сгруппировать в Map<K, List<T>>; со вторым аргументом — посчитать, просуммировать, собрать в множество;
  • partitioningBy(predicate) — разделить на две группы по условию;
  • counting(), summingInt, averagingDouble, mapping.

С Java 16 для списка есть короткий stream.toList() — он возвращает неизменяемый список.

Ловушки toMap:

  • если два элемента дают одинаковый ключ, будет IllegalStateException — нужен третий аргумент, функция слияния;
  • значение null вызывает NullPointerException.

Пример

Map<String, List<Order>> byCity = orders.stream()
        .collect(Collectors.groupingBy(Order::city));

Map<String, Long> countByCity = orders.stream()
        .collect(Collectors.groupingBy(Order::city, Collectors.counting()));

Map<String, Integer> totalByCustomer = orders.stream()
        .collect(Collectors.toMap(Order::customer, Order::total, Integer::sum));

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

  • Назначение collect.
  • Основные коллекторы, особенно groupingBy.
  • Ловушки toMap.

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

  • Собирать в карту без обработки повторяющихся ключей.
  • Допускать null-значения при сборке в карту.

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

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

Показать варианты и ответ
  • ✓Собирает элементы конвейера в результирующую структуру — список, множество, карту или строку
  • ✗Фильтрует элементы по заданному условию
  • ✗Сортирует элементы перед выводом
  • ✗Запускает обработку в несколько потоков

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

  • Чем сборка отличается от свёртки через reduce?
  • Как посчитать количество элементов в каждой группе?

Разбор темы

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

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

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

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

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