diff options
author | mduigou <none@none> | 2013-06-18 16:03:10 -0700 |
---|---|---|
committer | mduigou <none@none> | 2013-06-18 16:03:10 -0700 |
commit | 8a44cfac490b550ab190eb4bcbb8dae02228b3d0 (patch) | |
tree | 740cb5779eaba630a199666ecb776c69e219a424 /src/share/classes/java/util/concurrent | |
parent | 23b4ea9060bde2ec0c7a87e86d5086ddea2adc77 (diff) | |
download | jdk8u_jdk-8a44cfac490b550ab190eb4bcbb8dae02228b3d0.tar.gz |
8016446: Improve forEach/replaceAll for Map, HashMap, Hashtable, IdentityHashMap, WeakHashMap, TreeMap, ConcurrentMap
Reviewed-by: forax, mduigou, psandoz
Contributed-by: Mike Duigou <mike.duigou@oracle.com>, Remi Forax <forax@univ-mlv.fr>
Diffstat (limited to 'src/share/classes/java/util/concurrent')
-rw-r--r-- | src/share/classes/java/util/concurrent/ConcurrentMap.java | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/share/classes/java/util/concurrent/ConcurrentMap.java b/src/share/classes/java/util/concurrent/ConcurrentMap.java index fee5689db8..f0c42bb321 100644 --- a/src/share/classes/java/util/concurrent/ConcurrentMap.java +++ b/src/share/classes/java/util/concurrent/ConcurrentMap.java @@ -35,6 +35,8 @@ package java.util.concurrent; import java.util.Map; +import java.util.Objects; +import java.util.function.BiFunction; /** * A {@link java.util.Map} providing additional atomic @@ -183,4 +185,26 @@ public interface ConcurrentMap<K, V> extends Map<K, V> { * or value prevents it from being stored in this map */ V replace(K key, V value); + + /** + * {@inheritDoc} + * + * @implNote This implementation assumes that the ConcurrentMap cannot + * contain null values and get() returning null unambiguously means the key + * is absent. Implementations which support null values + * <strong>must</strong> override this default implementation. + */ + @Override + default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { + Objects.requireNonNull(function); + forEach((k,v) -> { + while(!replace(k, v, function.apply(k, v))) { + // v changed or k is gone + if( (v = get(k)) == null) { + // k is no longer in the map. + break; + } + } + }); + } } |