一.源码
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
二.具体方法
next()
:通过反复调用next
方法,可以逐个访问集合中的每个元素。但是,如果到达了集合的末尾,next
方法将抛出一个NoSuchElementException
。因此,需要在调用next
之前调用hasNext
方法。如果迭代器对象还有多个供访问的元素,这个方法就返回true。如果想要查看集合中的所有元素,就请求一个迭代器,并在hasNext
返回true时反复地调用next
方法。forEachRemaining
:从Java SE 8开始,甚至不用写循环。可以调用forEachRemaining
方法并提供一个lambda表达式,直到在没有元素为止。
iterator.forEachRemaining(element ->{
System.out.println(element);
});
三.特点
- 使用迭代器时,查找操作与位置变更是紧密相连的。查找一个元素的唯一方法时调用
next
,而在执行查找操作的同时,迭代器的位置随之向前移动。 - 因此,应当将Java迭代器认为是位于两个元素之间。当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。
Iterator
接口的remove方法将会删除上次调用next方法时返回的元素。- 如果调用remove之前没有调用next将是不合法的。如果这样做,将会抛出一个
IllegalStateException
异常。