On Jun 13 2013, at 14:56 , Remi Forax wrote:

> On 06/13/2013 04:47 PM, Paul Sandoz wrote:
>> 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) ?
> 
> yes, as I said to Mike, what is important IMO is that the semantics of 
> forEach and the semantics of for(:) should be the same.

This seems like an undue restriction unless the order of elements in the entry 
set is specified. Otherwise it implies a dependence upon an unspecified order. 
To guarantee that forEach and for(:entrySet) will use the same unspecified 
order seems an inappropriate. Would you tolerate:

     * Performs the given action on each entry in this map until all entries 
     * have been processed or the action throws an {@code Exception}.
     * Exceptions thrown by the action are relayed to the caller. The entries
     * will be processed in entry set iterator order unless that order is
     * unspecified in which case implementations may use an order which differs
     * from the entry set iterator.

I really want to avoid tying the hands of future implementators. The most 
frustrating specifications to conform to are those which were unnecessary or 
poor judgement.

Mike

Reply via email to