Iterable接口的使用

一,介绍。

在对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);
      }
    }
}

结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章