Lets have a look at this example:
public class ListIteratorTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("element1");
list.add("element2");
list.add("element3");
list.add("element4");
ListIterator<String> iterator = list.listIterator();
}
}
And now, this works fine:
// prints elements out, and then appropriately removes one after another
while (iterator.hasNext()){
System.out.println(iterator.next());
iterator.remove();
}
while this throws an IllegalStateException:
// throws IllegalStateException, why?
iterator.forEachRemaining(n -> {
System.out.println(n);
iterator.remove();
});
My question is short: why?
Updated thanks to @studro. See his comment below.
The API documentation states:
The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.
It seems like the "unspecified behavior" part also applies during this internal iteration.
Granted, the documentation for forEachRemaining
states that the behavior is equivalent to
while (hasNext())
action.accept(next());
and if action::accept
did in fact call iterator.remove()
the above snippet should not throw any exception (if remove
is a supported operation). This might be a documentation bug.
来源:https://stackoverflow.com/questions/29210510/why-iterator-foreachremaining-doesnt-remove-element-in-the-consumer-lambda