Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования