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,12 +1135,10 @@
* 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
@@ -1168,25 +1166,15 @@
*/
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) {
+ V newValue = (oldValue == null) ? value :
+ remappingFunction.apply(oldValue, value);
+ if(newValue == null) {
remove(key);
- return null;
} else {
- put(key, value);
- return value;
- }
+ put(key, newValue);
}
+ return newValue;
}
}