We'll be using https://bugs.openjdk.java.net/browse/JDK-8029055 for this issue.

I've posted a webrev here:

http://cr.openjdk.java.net/~mduigou/JDK-8029055/0/webrev/

There is an identical change in ConcurrentMap's merge().

Mike

On Nov 22 2013, at 16:01 , Henry Jen <henry....@oracle.com> wrote:

> 
> On 11/21/2013 06:33 PM, David Holmes wrote:
>> On 22/11/2013 5:02 AM, Louis Wasserman wrote:
>>> While I agree that case should be specified, I'm not certain I follow why
>>> that's what's going on here.
>>> 
>>> The weird condition is that if oldValue is null, not value; oldValue
>>> is the
>>> old result of map.get(key).  The Javadoc seems not just unspecified, but
>>> actively wrong.  Here's a worked example:
>>> 
>>> Map<String, Integer> map = new HashMap<>();
>>> map.merge("foo", 3, Integer::plus);
>>> Integer fooValue = map.get("foo");
>>> 
>>> Going through the Javadoc-specified default implementation:
>>> 
>>>   V oldValue = map.get(key); // oldValue is null
>>>   V newValue = (oldValue == null) ? value :
>>>                remappingFunction.apply(oldValue, value);
>>>      // newValue is set to value, which is 3
>>>   if (newValue == null) // newValue is nonnull, branch not taken
>>>       map.remove(key);
>>>   else if (oldValue == null) // oldValue is null, branch taken
>>>       map.remove(key); // removes the entry from the map
>>>   else // else if was already triggered, branch not taken
>>>       map.put(key, newValue);
>>> 
> 
> Seems like a document bug to me, we should fix this @implSpec.
> 
> Cheers,
> Henry
> 

Reply via email to