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:
It seems like the "unspecified behavior" part also applies during this internal iteration.
Granted, the documentation for
forEachRemaining
states that the behavior is equivalent toand if
action::accept
did in fact calliterator.remove()
the above snippet should not throw any exception (ifremove
is a supported operation). This might be a documentation bug.