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

Что произойдёт в Collectors.toMap, если два элемента дают одинаковый ключ, а merge-функция не передана?

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

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 здесь?

Разбор темы

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

Партнёр платформы

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

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

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