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

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

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

IllegalStateException: Duplicate key. При возможных дубликатах передают третий аргумент — функцию слияния: (a, b) -> a, сумма, конкатенация.

  • Четвёртый аргумент — фабрика карты: LinkedHashMap::new, TreeMap::new
  • Нужны все значения по ключу — groupingBy, а не toMap
  • Частая причина падений в проде: данные оказались не уникальны

А ещё null-значение — отдельная ловушка: NPE

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

Подробно

toMap(keyFn, valueFn) при конфликте ключей падает с IllegalStateException (Duplicate key). Поэтому при возможных дубликатах ОБЯЗАТЕЛЬНО передают третий аргумент — функцию слияния ((a,b)->a, сумма и т.п.). Это типичная причина падений на проде, когда данные оказались не уникальны.

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

  • Какое исключение.
  • Функция слияния и альтернатива groupingBy.

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

  • Звать toMap без merge на неуникальных ключах.
  • Ждать, что дубликат молча перезапишется.

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

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

Показать варианты и ответ
  • ✓Бросится IllegalStateException (Duplicate key); при возможных дубликатах передают третий аргумент — merge-функцию
  • ✗Последний элемент молча перезапишет предыдущий
  • ✗Первый сохранится, остальные молча отбросятся
  • ✗Вернётся null вместо карты

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

  • Как собрать Map<K, List<V>> вместо конфликта?
  • Чем groupingBy отличается от toMap здесь?

Разбор темы

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

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

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

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

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