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

Функция значения в Collectors.toMap вернула null для одного из элементов. Что произойдёт?

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

NullPointerException, хотя HashMap null-значения допускает: коллектор использует merge, а он по контракту запрещает null — не отличить от отсутствия ключа.

  • Проявляется только на конкретных данных — часто уже в проде
  • Обход: отфильтровать null, подставить значение по умолчанию, собрать вручную через collect(HashMap::new, (m, e) -> m.put(...), Map::putAll)
  • Или хранить Optional — но это спорно

А ещё null-ключ toMap допускает

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

Подробно

Причина в реализации: коллектор использует merge, а этот метод по контракту запрещает null-значение, потому что не может отличить его от отсутствия ключа. Ловушка неприятна тем, что проявляется на конкретных данных и часто уже в production. Обходные пути: отфильтровать такие элементы заранее, подставить значение по умолчанию, либо собирать через Collectors.groupingBy или через toMap с явной фабрикой карты и собственной логикой. Стоит помнить и вторую ловушку того же коллектора: при повторяющемся ключе без функции слияния бросается IllegalStateException — и это отдельная от null-значений проблема.

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

  • Исключение и его причина.
  • Обходные пути.

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

  • Считать, что коллектор ведёт себя так же, как прямое обращение к HashMap.put.
  • Путать поведение при дублирующемся ключе и при null-значении.

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

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

Показать варианты и ответ
  • ✓NullPointerException: toMap не допускает null-значений, хотя обычный HashMap их разрешает
  • ✗В карту попадёт пара с null-значением
  • ✗Элемент будет тихо пропущен
  • ✗Будет брошено IllegalStateException

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

  • Как собрать карту, допускающую null-значения?
  • Что делает третий аргумент toMap?

Разбор темы

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

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

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

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

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