Что делает терминальная операция collect?
- Как сгруппировать элементы стрима?
- Что такое 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?
- Как посчитать количество элементов в каждой группе?
Разбор темы
- Collectors и свёртка
reduce против collect, базовые коллекторы и ловушка toMap, группировка и downstream-коллекторы, характеристики и параллельность.
Связанные вопросы
- Функция значения в Collectors.toMap вернула null для одного из элементов. Что произойдёт? Middle
- Чем collect отличается от reduce при сборке стрима? Middle
- Как одним коллектором получить «количество элементов в каждой группе»? Middle
- Что произойдёт в Collectors.toMap, если два элемента дают одинаковый ключ, а merge-функция не передана? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.