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

时间:2015-03-23 12:42:30

标签: lambda java-8 listiterator

让我们看看这个例子:

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

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

1 个答案:

答案 0 :(得分:16)

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

API documentation州:

  

如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。

似乎“未指定的行为”部分也适用于此内部迭代。

当然,forEachRemaining的文档声明行为等同于

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

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

相关问题