Map.forEach

Mike Duigou mike.duigou at oracle.com
Tue Dec 10 03:49:28 UTC 2013


On Dec 9 2013, at 17:50 , Martin Buchholz <martinrb at google.com> wrote:

> Current ConcurrentMap.forEach
> http://gee.cs.oswego.edu/dl/concurrent/dist/docs/java/util/concurrent/ConcurrentMap.html#replaceAll-java.util.function.BiFunction-
> has two different "specs" for the default method:
> 
> Implementation Requirements:
> The default implementation is equivalent to, for this map:
>  
>  for (Map.Entry<K,V> entry : map.entrySet())
>    action.accept(entry.getKey(), entry.getValue());
>  
> Implementation Note:
> The default implementation assumes that IllegalStateException thrown by getKey() or getValue() indicates that the entry no longer exists. Operation continues for subsequent entries.
> 
> But these are contradictory!

I intentionally omitted the exception handling from the pseudo code to make it more readable. Barring entries being removed, the pseudo-code is accurately describes what happens. This is true for both the ConcurrentMap and Map implementations.

I'd prefer to change pseudo-code, if that's what's wanted, than the implementations.

>  Furthermore, given that any Map might end up giving us ISE, shouldn't we be using the ConcurrentMap implementation in Map (and specifying the ISE-skipping behavior?)  Whether or not to skip ISE should not be an Implementation Note, I think - it should be "spec".

Skipping removed entries makes sense for ConcurrentMap. For the basic Map it's assumed that it's not concurrent and thus an ISE is actually a sign that a CME should be thrown (which is what it does)

Mike


More information about the core-libs-dev mailing list