src/share/classes/java/util/Map.java

Print this page
rev 8834 : 8029055: Map.merge and ConcurrentMap.merge @implSpec is not correct in case of non-existing key-value pair or a null value entry
Reviewed-by: duke

*** 1135,1146 **** * V oldValue = map.get(key); * V newValue = (oldValue == null) ? value : * remappingFunction.apply(oldValue, value); * if (newValue == null) * map.remove(key); - * else if (oldValue == null) - * map.remove(key); * else * map.put(key, newValue); * }</pre> * * <p>The default implementation makes no guarantees about synchronization --- 1135,1144 ----
*** 1168,1192 **** */ default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { Objects.requireNonNull(remappingFunction); V oldValue = get(key); ! if (oldValue != null) { ! V newValue = remappingFunction.apply(oldValue, value); ! if (newValue != null) { ! put(key, newValue); ! return newValue; ! } else { ! remove(key); ! return null; ! } ! } else { ! if (value == null) { remove(key); - return null; } else { ! put(key, value); ! return value; ! } } } } --- 1166,1180 ---- */ default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { Objects.requireNonNull(remappingFunction); V oldValue = get(key); ! V newValue = (oldValue == null) ? value : ! remappingFunction.apply(oldValue, value); ! if(newValue == null) { remove(key); } else { ! put(key, newValue); } + return newValue; } }