首页 > 代码库 > 迭代器模式

迭代器模式

Iterator:我们先来看一下这个接口,实际上的抽象方法就2个,hasNext和next

package java.util;

import java.util.function.Consumer;

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

 

1、hasNext是用于判断是否有下一个元素,看到这个方法,大家应该也知道Iterator接口是用于什么样的数据了--集合|数组类型

2、next是用于获取下一个元素的方法

 

这两个方法组成了这样的调用方式:

while(iterator.hasNext()) {
  Object one = iterator.next();
  one.action();
}

 

它不像js中的调用方式

$("a").each(function(obj) {
  obj.action();
})

js采用的是传入回调函数,通过调用回调函数的方式来遍历集合执行动作

 

所以我们把js的这种方式称为:内部迭代器

 

特点也很明显

 

内部迭代器需要集合支持传入回调函数

 

而且无法在操作的过程中直接中断操作等

 

并且会引入闭包问题,即在内部迭代器中调用当前上下文变量的问题

 

所以在使用中,倾向于灵活的外部遍历,或者倾向于简单的内部遍历,见仁见智

 

迭代器的设计意图经过上述的例子,也比较清晰了

 

使得不同的集合类型,可以用相同的方式来遍历

 

迭代器模式