JDK8源码阅读笔记
切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

Iterator


集合上的迭代器。Iterator在Java集合框架中取代Enumeration。迭代器与枚举有两个不同之处:

  • 迭代器允许调用者在迭代期间以明确的语义从基础集合中删除元素。
  • 方法名已得到改进。

该接口也是Java集合框架的成员。

1. boolean hasNext()

如果当前迭代器包含更多元素,则返回true。(换句话说,如果调用next方法将返回一个元素而不是抛出异常,则返回true。)

2. E next()

返回当前迭代器的下一个元素,如果不存在,则抛出NoSuchElementException

3. default void remove()

从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next方法后只能调用此方法一次。如果在进行迭代时以任何方式修改基础集合,而不是调用此方法,则此时当前迭代器的行为将变得不确定。 可以看到该方法定义中有default关键字,其有一个默认实现,但是此默认执行仅抛出了一个UnsupportedOperationException,并无其他操作。 如果next方法还没有被调用,或者remove方法在最后一次调用next方法之后已经被调用过,则抛出IllegalStateException

源码如下:

default void remove() {
    throw new UnsupportedOperationException("remove");
}

4. default void forEachRemaining(Consumer<? super E> action)

对剩下的元素执行参数中指定的操作,直到所有元素(即剩下的所有元素)都被处理或者有异常抛出。如果指定了迭代的顺序,操作将按照迭代的顺序执行。 由action引发的异常会被转发给调用者。

源码如下:

default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}

测试用例:

@Test
public void testIterator() {
  List<Integer> list = new ArrayList<>();
  list.add(1);
  list.add(2);
  list.add(3);
  list.add(4);
  list.add(5);
  Iterator<Integer> iterator = list.iterator();
  iterator.next();
  iterator.next();
  iterator.forEachRemaining(System.out::println);
}

输出:

3
4
5