RFR: 8005051: optimized defaults for Iterator.forEachRemaining

Akhil Arora akhil.arora at oracle.com
Wed May 1 22:55:28 UTC 2013


On 04/26/2013 04:52 AM, Paul Sandoz wrote:
>
> On Apr 24, 2013, at 7:57 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>
>> On 04/24/2013 07:24 PM, Akhil Arora wrote:
>>> On 04/24/2013 06:19 AM, Alan Bateman wrote:
>>>> On 23/04/2013 20:18, Akhil Arora wrote:
>>>>> On 04/22/2013 11:42 AM, Alan Bateman wrote:
>>>>>> One thing I meant to ask when forEachRemaining was added was whether it
>>>>>> should say anything about the "last element"? I see in the webrev that
>>>>>> you've set it for the ArrayList iterators but not the LinkedList
>>>>>> iterator - should it?
>>>>>
>>>>> done, and added more tests for the state of the iterator after
>>>>> forEachRemaining returns
>>>>>
>>>>> http://cr.openjdk.java.net/~akhil/8005051.2/webrev/
>>>>>
>>>>> (a portion of version 1 of the webrev has already been pushed to TL as
>>>>> part of rev 6973 http://hg.openjdk.java.net/jdk8/tl/jdk/rev/98a7bb7baa76)
>>>> The remaining changes in the webrev looks okay to me. Also good to have
>>>> the test expanded.
>>>>
>>>> So do you think that the javadoc should say anything about the
>>>> relationship between forEachRemaining and remove?
>>>
>>> Good question. forEachRemaining docs state -
>>>
>>> Implementation Requirements:
>>>
>>>     The default implementation behaves as if:
>>>
>>>     while (hasNext())
>>>              action.accept(next());
>>>
>>> so a subsequent remove() should remove the last element.
>>>
>>> To avoid blocking the feature, I have filed
>>> https://jbs.oracle.com/bugs/browse/JDK-8013150 to refine the behavior of remove and other ListIterator methods after forEachRemaining returns.
>>
>> I think the fact that the last element can be removed should be specified as unspecified,
>> because it's more an artefact of the default implementation than something which part
>> of the semantics.
>>
>
> I was wondering about that too. What happens if an implementing class decides later on to override the default implementation? If the overriding implementation does not conform to the same behaviour as the default it could break compatibility.
>
> Plus one could change code from:
>
>    while(it.hasNext() { doSomething(it.next()); }
>    doSomethingAtEnd(it);
>
> to
>
>    it.forEachRemaining(this::doSomething}
>    doSomethingAtEnd(it);
>
> Paul.

The testOptimizedForEach test verifies that remove() and previous() work 
as expected after forEachRemaining returns (lines 238-251). Please review -

http://cr.openjdk.java.net/~akhil/8013150/webrev/

Somehow tests got left behind in the previous commit, adding them back.

Thanks



More information about the core-libs-dev mailing list