RFR 8168745 Iterator.forEachRemaining vs. Iterator.remove (original) (raw)
Martin Buchholz martinrb at google.com
Mon Nov 21 23🔞11 UTC 2016
- Previous message: RFR 8168745 Iterator.forEachRemaining vs. Iterator.remove
- Next message: RFR 8168745 Iterator.forEachRemaining vs. Iterator.remove
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Mon, Nov 21, 2016 at 2:29 PM, Paul Sandoz <paul.sandoz at oracle.com> wrote:
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. Stronger, perhaps! There's a corner case where a user sees hasNext() returning false, then calls remove(). Perhaps it's a weird way of deleting the last element. That seems more defensible user code than calling remove() after forEachRemaining. In some classes maintaining the ability to delete the last element is a burden, as in ArrayBlockingQueue.
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!
- Previous message: RFR 8168745 Iterator.forEachRemaining vs. Iterator.remove
- Next message: RFR 8168745 Iterator.forEachRemaining vs. Iterator.remove
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]