Iterator
集合上的迭代器。Iterator
在Java集合框架中取代Enumeration
。迭代器与枚举有两个不同之处:
- 迭代器允许调用者在迭代期间以明确的语义从基础集合中删除元素。
- 方法名已得到改进。
该接口也是Java集合框架的成员。
如果当前迭代器包含更多元素,则返回true
。(换句话说,如果调用next
方法将返回一个元素而不是抛出异常,则返回true
。)
返回当前迭代器的下一个元素,如果不存在,则抛出NoSuchElementException
。
从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next
方法后只能调用此方法一次。如果在进行迭代时以任何方式修改基础集合,而不是调用此方法,则此时当前迭代器的行为将变得不确定。 可以看到该方法定义中有default
关键字,其有一个默认实现,但是此默认执行仅抛出了一个UnsupportedOperationException
,并无其他操作。 如果next
方法还没有被调用,或者remove
方法在最后一次调用next
方法之后已经被调用过,则抛出IllegalStateException
。
源码如下:
default void remove() {
throw new UnsupportedOperationException("remove");
}
对剩下的元素执行参数中指定的操作,直到所有元素(即剩下的所有元素)都被处理或者有异常抛出。如果指定了迭代的顺序,操作将按照迭代的顺序执行。 由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