# 迭代器模式

用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

# 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());
}