On Jun 13, 2013, at 4:06 PM, Remi Forax <fo...@univ-mlv.fr> wrote:
>> 
>>> There is a difference between an Iterator/forEach and a spliterator/stream,
>>> with a stream you know that the called lambdas will not interfere and 
>>> mutate the source collection.
>>> 
>> You do? I don't think there is any conceptual difference between the 
>> following w.r.t. interference:
>> 
>>   ArrayList l = ...
>>   l.stream().filter(...).forEach(e -> l.add(e));
>>   l.spliterator().forEachRemaining(e -> l.add(e));
>> 
>> and:
>> 
>>   ArrayList l = ...
>>   l.forEach(e -> l.add(e));
>>   l.iterator().forEachRemaining(e -> l.add(e));
>> 
>> Of course we have (or will have) strong wording saying don't implement 
>> interfering lambdas, but we still have to check for co-modification in the 
>> traversal methods of ArrayList spliterator.
> 
> Isn't it because if you remove an element from an ArrayList while iterating 
> you can see a stale value ?
> While with a HashMap, if you have only one thread, you can not see a stale 
> entry ?

Assuming just one thread do you agree that in all of the above examples the 
only way the list can be interfered with is by the Consumer instance e -> 
l.add(s) ?


> So a spliterator on HashMap can only check the modCount at the end unlike the 
> one on ArrayList that need to check at each step.
> 

The ArrayList.spliterator.forEachRemaining implementation also checks at the 
end.

Paul.

Reply via email to