让我们看看这个例子:
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();
}
}
现在,这很好用:
// prints elements out, and then appropriately removes one after another
while (iterator.hasNext()){
System.out.println(iterator.next());
iterator.remove();
}
虽然抛出IllegalStateException:
// throws IllegalStateException, why?
iterator.forEachRemaining(n -> {
System.out.println(n);
iterator.remove();
});
我的问题很简短:为什么?
答案 0 :(得分:16)
感谢@studro。请参阅下面的评论。
如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
似乎“未指定的行为”部分也适用于此内部迭代。
当然,forEachRemaining
的文档声明行为等同于
while (hasNext())
action.accept(next());
如果action::accept
确实调用iterator.remove()
,则上述代码段不应抛出任何异常(如果remove
是受支持的操作)。这可能是文档错误。