一,介绍。
在对List遍历时,通常有三种方式:
List<String> lists = Arrays.asList("aaa","bbb","ccc","ddd");
//第一种
for(int i = 0; i < lists.size(); i++){
System.out.println(lists.get(i));
}
//第二种
for(String str : lists){
System.out.println(str);
}
//第三种
lists.forEach(x->System.out.println(x));
第一种为传统的循环方式。
第三种方式是jdk1.8提供的lambda表达式。
第二种方式的循环又叫做增强for循环,在使用时比方式一方便不少,而之所以能够这样进行循环是因为其实现了Iterable接口。
二,使用。
List继承于Collection接口而Collection接口又继承于Iterable,因此所有直接或间接继承于Collection的类都具有增强for循环的功能。
//接口定义
public interface Collection<E> extends Iterable<E>{
//...
}
Iterable接口中有一个返回Iterator对象的iterator方法,Iterator接口中主要有两个方法,一是判断是否还有下一个元素的hasNext方法,一个是返回下一个元素的next方法,
interface Iterator<E>{
bool hasNext();
E next();
}
知道了它们之间的关系就可以让我们的类也实现那样遍历的功能。
要求:实现倒序输出的List
代码如下。
class ReverseList<T> implements Iterable<T>{
private List<T> lists = new ArrayList<>();
private int n;
public ReverseList(Collection<T> c){
lists.addAll(c);
n = lists.size() - 1;
}
public int size(){
return lists.size();
}
//实现iterator方法
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return n >= 0;
}
@Override
public T next() {
return lists.get(n--);
}
};
}
}
如上所示,底层使用arrayList来存储数据,arrayList默认输出时是正序的,我们只需稍加改造实现Iterable接口即可,iterator方法返回一个Iterator的对象,Iterator也是个接口,此处可以通过内部类,或者像我这样的匿名内部类的方式直接进行实现。
三,测试。
public class ReverseListTest {
public static void main(String[] args){
Collection<String> c =
Arrays.asList("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
ReverseList<String> list = new ReverseList<>(c);
for(String str : list){
System.out.println(str);
}
}
}
结果: