Collectors.toMap падает там, где HashMap.put молчит
Collectors.toMap падает там, где HashMap.put молчит Привычка к map.put() подводит при переходе на стримы: Map<String, User> byEmail = users.stream() .collect(Collectors.toMap(User::email, u -> u)); Здесь сразу две мины: 1. Дубликаты ключей → IllegalStateException. Map.put тихо перезаписал бы значение, а toMap без merge-функции бросает «Duplicate key». Фикс — третий аргумент: .collect(Collectors.toMap(User::email, u -> u, (a, b) -> b)); // оставить последний 2. null в значении → NullPointerException. Под капотом toMap использует Map.merge, который по контракту не допускает null-значение. HashMap сам по себе null-значения разрешает, поэтому баг ловится не на ровной коллекции, а на «редких» данных в проде: .collect(Collectors.toMap(User::email, User::nickname)); // nickname == null -> NPE Если значение может быть null, собирай вручную в HashMap через forEach/reduce или фильтруй заранее. Стоит держать в голове: toMap строже, чем тот Map, который он создаёт.