Iterator和 Iterable接口源码阅读
Iterator
Iterator
属于 java 集合框架,是一个集合上的迭代器,它在 Java 集合框架中代替了枚举。但是它又与枚举有两点不同:
- 迭代器允许调用者在迭代期间使用定义明确的语句从基础集合中删除元素。
- 方法名称进行了改进。
接口的定义如下:
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());
}
}
Iterator
主要有四个方法,分别是:
-
boolean hasNext()
:如果迭代器中有下一个元素,就返回true
; -
E next()
:返回在迭代器中的下一个元素。如果迭代器中没有元素,则抛出一个NoSuchElementException
请求元素不存在异常。 -
default void remove()
:移除迭代器最后返回的一个元素,也就是调用next()
返回的这个元素。需要注意的是,每调用一次next()
只能执行一次remove()
。这个方法是默认实现了抛出UnsupportedOperationException
不支持操作异常。default
关键字是在java
8 中引入的关键字,可以用于在接口内部包含一些默认实现的方法,也就是接口中可以包含方法体,打破了 Java 之前版本对接口的语法限制,从而使得接口在扩展的时候,不会破坏与接口相关的实现类代码。使用default
的方法在实现类中可以使用接口默认的方法,也可以重接接口的方法。 -
default void forEachRemaining(Consumer<? super E> action)
:将Iterator
中迭代剩余的元素传递给一个函数。调用时会先判断传入的参数是否为空,如果为空就抛出
NullPointerException
。
Iterable
实现了Iterable
接口后,就代表此类实例化后的对象是可迭代的,对象就可以成为 “for-each 循环” 语句的目标。
接口的定义如下:
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Iterable
接口中有三个方法,分别是:
-
Iterator<T> iterator()
:返回一个元素类型为泛型的迭代器。 -
default void forEach(Consumer<? super T> action)
:对于Iterable
的每个元素执行给定的操作,知道处理完所有元素或该操作引发异常为止。如果实现类中没有另外指定,则操作的顺序将按照迭代器的顺序执行(如果指定了迭代顺序)。调用时会先判断传入的参数是否为空,如果为空就抛出
NullPointerException
。如果该操作引发了异常,将会把异常转移到调用方。 -
default Spliterator<T> spliterator()
:返回一个Spliterator
。