HashMap null check in Merge Operation
The behavior is mandated by the Map.merge
contract:
Throws:
…
NullPointerException - if the specified key is null and this map does not support null keys or the value or remappingFunction is null
Note that using Map.merge
for Collectors.toMap
without a merge function is an implementation detail; it not only disallows null
values, it does not provide the desired behavior for reporting duplicate keys, the Java 8 implementation wrongly reports one of the two values as key when there are duplicate keys.
In Java 9, the implementation has been completely rewritten, it does not use Map.merge
anymore. But the new implementation is behavioral compatible, now having code explicitly throwing when the value is null
. So the behavior of Collectors.toMap
not accepting null
values has been fixed in the code and is not an artifact of using Map.merge
anymore. (Still speaking of the toMap
collector without a merge function only.)
Unfortunately, the documentation does not tell.
Because internally for Collectors.toMap
, Map#merge
is used - you can't really do anything about it. Using the static Collectors.toMap
is not an option (which by the way is documented to throw a NullPointerException
).
But spinning a custom collector to be able to do what you want (which you have not shown) is not that complicated, here is an example:
Map<Integer, Integer> result = Arrays.asList(null, 1, 2, 3)
.stream()
.collect(
HashMap::new,
(map, i) -> {
map.put(i, i);
},
HashMap::putAll);