1. 写在前面
迭代器 Iterator 平时使用的场景很少。我们这次学习一下 Iterator 这个东西。
2. 一个case
在使用集合的时候,经常会使用 for each
来对集合进行遍历。
而事实上,这个 for each
的遍历是通过 Iterator
来实现的,编译器将 for each
的写法改写成为了普通的 for
循环。
for(Iterator<String> it = list.iterator; it.hasNext; ){
// 代码逻辑
}
因此,对任何一个集合类来说,如果想要通过 for each
来遍历其中的元素,都需要满足如下2个条件:
- 实现
Iterable
接口,该接口返回一个Iterator
对象 - 返回的 Iterator 对象需要知道如何遍历元素
下面我们搞一个 反序遍历的 集合类
/**
* 自己编写的一个集合类
* 为了支持 for each 因此需要满足2个点:
* - 集合类实现 Iterable 接口,该接口要求返回一个 Iterator 对象
* - 用 Iterator 对象迭代结合内部数据 (这个返回的 Iterator 对象需要知道如何遍历)
* @param
*/
static class ReverseList<T> implements Iterable<T> {
List<T> list = new ArrayList<>();
public void add(T t){
list.add(t);
}
@Override
public Iterator<T> iterator() {
// 这里需要返回一直知道如何遍历集合的 Iterator
return new ReverseIterator(list.size());
}
/**
* 内部类实现一个 Iterator
*/
class ReverseIterator implements Iterator{
int index;
ReverseIterator(int index){
this.index = index;
}
@Override
public Object next() {
index--;
return ReverseList.this.list.get(index);
}
@Override
public boolean hasNext() {
return index>0;
}
}