# 迭代器模式
用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
# Java
java.util.Collection 继承 java.lang.Iterable,使用此模式创建迭代器。
List<Integer> collect = Arrays.stream(new int[]{2, 3, 5})
.boxed()
.collect(Collectors.toList());
Iterator it = collect.iterator();
while (it.hasNext()) {
System.out.println(it.next());
it.remove();
}
为什么继承 Iterable 而不继承 Iterator
因为 Iterator 接口的核心方法 next() 或者 hasNext() 依赖于迭代器的当前迭代位置。
如果 Collection 直接实现 Iterator 接口,会导致集合对象中包含当前迭代位置的数据。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么 next() 方法的结果不可预知。
除非为 Iterator 接口添加一个 reset() 方法,用来重置当前迭代位置。即使这样,Collection 也只能同时存在一个当前迭代位置。而 Iterable 则不然,每次调用都会返回一个从头开始计数的迭代器。多个迭代器是互不干扰的。
java.util.ListIterator
java.util.ListIterator 是 java.util.Iterator 的子接口,可以逆向遍历
List<Integer> collect = Arrays.stream(new int[]{2, 3, 5})
.boxed()
.collect(Collectors.toList());
ListIterator it = collect.listIterator();
while (it.hasNext()) {
System.out.println(it.next());
}
while (it.hasPrevious()) {
System.out.println(it.previous());
}