Hi Roman;

Somewhat unfortunately, "just return null" is what the default and all 
conforming implementations do of compute do when presented with a Map 
containing a mapping to null and a mapping function returning null. The 
specification of the new Java 8 Map methods does not always handle maps 
containing null values as clean as might be wished. This is mostly to maintain 
consistent semantics with some pre-java 8 ConcurrentHashMap operations. The 
chain of debatable decisions all starts with "putIfAbsent()" and then tries to 
proceed consistently to the other new default operations. In general a 
null-value mapping in a Map is treated as absent--the same way as CHM would 
treat a get() returning null. Every attempt I made at improving the behaviour 
of mapping to null values ended up being weirder and more mysterious than what 
Java 8 shipped with.

Sorry.

Mike

On Jul 20 2014, at 15:25 , David Holmes <david.hol...@oracle.com> wrote:

> See:
> 
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/018251.html
> 
> and related bug report.
> 
> David
> 
> On 21/07/2014 6:01 AM, Paul Sandoz wrote:
>> Begin forwarded message:
>>> -------- Пересылаемое сообщение--------
>>> 17.07.2014, 19:20, "Roman Leventov" <leven...@ya.ru>:
>>> 
>>> Map.compute() Javadoc has the following paragraph:
>>> --------
>>> The default implementation is equivalent to performing the following steps 
>>> for this map, then returning the current value or null if absent:
>>> 
>>>  V oldValue = map.get(key);
>>>  V newValue = remappingFunction.apply(key, oldValue);
>>>  if (oldValue != null ) {
>>>     if (newValue != null)
>>>        map.put(key, newValue);
>>>     else
>>>        map.remove(key);
>>>  } else {
>>>     if (newValue != null)
>>>        map.put(key, newValue);
>>>     else
>>>        return null;
>>>  }
>>> --------
>>> 
>>> But this code don't correspond neither verbal description of the behaviour 
>>> nor the actual default implementation in java.util.Map. If the oldValue is 
>>> null and newValue is null, map should still remove the key, not to just 
>>> `return null;`
>>> 
>> 

Reply via email to