> On 21 Nov 2016, at 13:21, Martin Buchholz <marti...@google.com> wrote: > > > > On Mon, Nov 21, 2016 at 1:01 PM, Paul Sandoz <paul.san...@oracle.com > <mailto:paul.san...@oracle.com>> wrote: > > > There's the question of what to promise after a call to forEachRemaining > > (whether or not an action threw). Perhaps a blanket > > """Subsequent behavior of an iterator is unspecified after a call to this > > method.""" > > > > I think that is overly limiting, it’s exceptions and remove that are > problematic. Assuming no exception it is fine to subsequently call next, > hasNext and forEachRemaining, each has well defined behaviour (throws > NoSuchElementException, false, no-op respectively). > > In a concurrent world, it's not so clear.
Good point, yes, i was thinking non-concurrent, but i would still expect it to hold for weakly consistent iterators. > A linked list based implementation could report hasNext() == false when > currentNode.next == null, but that might change before the next call to > hasNext(). AFAIK, all of our concrete implementations don't have this > property - the iterator being exhausted is a "sticky" property, in part > because it's nice to the GC to null out fields at the end. One can imagine > an iterator (or spliterator) designed to work differently, e.g. tryAdvance > would be a way of "polling" the stream of elements to see whether any are > available, and would eventually visit all elements added. > > Back in the real world, forEachRemaining is a particularly strong hint that > this iterator/spliterator should be forever exhausted. Yes :-) i would argue as strong a hint as that of hasNext returning false. Paul. > Perhaps where that matters (ArrayBlockingQueue) we could even add such a > thing to the spec. We discourage use of Iterators with ABQ, in part because > in the past there was no way to "close" an Iterator. But now there is!