On Apr 26, 2013, at 4:37 PM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
> Another "interesting" usage:
> 
> Iterator<?> i = ...;
> 
> i.forEachRemaining(e -> {
>   ...
>   if (...) {
>      i.forEachRemaining(dummy -> {}); // drain it
>   }
>   ...
> });
> 
> It seems that mixing external and internal iteration in the same object is 
> like a box of chocolates. For internal iteration, Iterable.forEach is more 
> suitable than Iterator.forEachRemaining unless the later is specified to have 
> the common state for both external and internal iteration, which means that 
> internal can not be more effective than external.
> 

Similar observations can apply to Spliterator as well. IIRC many 
spliterator.forEachRemaining implementations set up state to be fully traversed 
before looping. However, it is not possible in all cases.

I think we may have to document that a consumer must not interfere with the 
current traversal otherwise behaviour is undefined.

Paul.

Reply via email to