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

結果:

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