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;
}
}