aboutsummaryrefslogtreecommitdiff
path: root/src/share/classes/java/util/concurrent
diff options
context:
space:
mode:
authormduigou <none@none>2013-06-18 16:03:10 -0700
committermduigou <none@none>2013-06-18 16:03:10 -0700
commit8a44cfac490b550ab190eb4bcbb8dae02228b3d0 (patch)
tree740cb5779eaba630a199666ecb776c69e219a424 /src/share/classes/java/util/concurrent
parent23b4ea9060bde2ec0c7a87e86d5086ddea2adc77 (diff)
downloadjdk8u_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.java24
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;
+ }
+ }
+ });
+ }
}