Что произойдёт в Collectors.toMap, если два элемента дают одинаковый ключ, а merge-функция не передана?
IllegalStateException: Duplicate key. При возможных дубликатах передают третий аргумент — функцию слияния: (a, b) -> a, сумма, конкатенация.
- Четвёртый аргумент — фабрика карты: LinkedHashMap::new, TreeMap::new
- Нужны все значения по ключу — groupingBy, а не toMap
- Частая причина падений в проде: данные оказались не уникальны
А ещё null-значение — отдельная ловушка: NPE
Подробно
toMap(keyFn, valueFn) при конфликте ключей падает с IllegalStateException (Duplicate key). Поэтому при возможных дубликатах ОБЯЗАТЕЛЬНО передают третий аргумент — функцию слияния ((a,b)->a, сумма и т.п.). Это типичная причина падений на проде, когда данные оказались не уникальны.
Что хотят услышать
- Какое исключение.
- Функция слияния и альтернатива groupingBy.
Частые ошибки
- Звать toMap без merge на неуникальных ключах.
- Ждать, что дубликат молча перезапишется.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Бросится IllegalStateException: при дубликатах нужна merge-функция
- ✗Последний элемент молча перезапишет предыдущий — как обычный вызов Map.put
- ✗Первый сохранится, остальные молча отбросятся
- ✗Вернётся null вместо карты
Что спросят дальше
- Как собрать Map<K, List<V>> вместо конфликта?
- Чем groupingBy отличается от toMap здесь?
Разбор темы
- Collectors и свёртка
reduce против collect, базовые коллекторы и ловушка toMap, группировка и downstream-коллекторы, характеристики и параллельность.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.