src/share/classes/java/util/IdentityHashMap.java

Print this page
rev 7313 : 8016446: Add override forEach/replaceAll to HashMap, Hashtable, IdentityHashMap, WeakHashMap, TreeMap
Reviewed-by: forax, duigou
Contributed-by: Mike Duigou <mike.duigou@oracle.com>, Remi Forax <forax@univ-mlv.fr>

@@ -25,10 +25,12 @@
 
 package java.util;
 
 import java.io.*;
 import java.lang.reflect.Array;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
 import java.util.function.Consumer;
 
 /**
  * This class implements the <tt>Map</tt> interface with a hash table, using
  * reference-equality in place of object-equality when comparing keys (and

@@ -1335,10 +1337,42 @@
         }
         tab[i] = k;
         tab[i + 1] = value;
     }
 
+    @Override
+    public void forEach(BiConsumer<? super K, ? super V> action) {
+        Objects.requireNonNull(action);
+        int expectedModCount = modCount;
+
+        Object[] t = table;
+        for (int index = 0; index < t.length; index += 2) {
+            if (modCount != expectedModCount)
+                throw new ConcurrentModificationException();
+
+            if (t[index] != null) {
+                action.accept((K) unmaskNull(t[index]), (V) t[index + 1]);
+            }
+        }
+    }
+
+    @Override
+    public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
+        Objects.requireNonNull(function);
+        int expectedModCount = modCount;
+
+        Object[] t = table;
+        for (int index = 0; index < t.length; index += 2) {
+            if (modCount != expectedModCount)
+                throw new ConcurrentModificationException();
+            
+            if (t[index] != null) {
+                t[index + 1] = function.apply((K) unmaskNull(t[index]), (V) t[index + 1]);
+            }
+        }
+    }
+
     /**
      * Similar form as array-based Spliterators, but skips blank elements,
      * and guestimates size as decreasing by half per split.
      */
     static class IdentityHashMapSpliterator<K,V> {