为什么 iterator.forEachRemaining 不删除 Consumer lambda 中的元素?

Why iterator.forEachRemaining doesnt remove element in the Consumer lambda?

让我们看一下这个例子:

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();
        });

我的问题很简短:为什么?

更新感谢@studro。请参阅下面他的评论。

API documentation 状态:

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.

似乎 "unspecified behavior" 部分也适用于此内部迭代。

当然,forEachRemaining 的文档指出该行为等同于

while (hasNext())
    action.accept(next());

如果 action::accept 实际上调用了 iterator.remove() 上面的代码片段不应抛出任何异常(如果 remove 是受支持的操作)。这可能是文档错误。