Java基礎之Iterable接口


Iterable接口是Java集合框架的頂級接口,實現此接口使集合對象可以通過迭代器遍歷自身元素。

查看源碼

package java.lang;
import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
public interface Iterable<T> {
    // 返回一個內部元素為T類型的順序迭代器
    Iterator<T> iterator();

    // 對Iterable中的元素進行指定的操作
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    // 返回一個內部元素為T類型的並行迭代器
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

總結

后兩個方法是Java8后新添加的,forEach()方法是為了方便遍歷並操作集合內的元素。spliterator()方法則提供了一個可以並行遍歷元素的迭代器,以適應現在cpu多核時代並行遍歷的需求。其中我們可以看下default修飾符,這也是Java8后新出現的。我們知道,如果我們給一個接口新添加一個方法,那么所有他的具體子類都必須實現此方法。為了能給接口拓展新功能,而又不必每個子類都要實現此方法,因此Java8新加了default關鍵字,被其修飾的方法可以不必由子類實現,並且由dafault修飾的方法在接口中有方法體,這打破了Java之前對接口方法的規范。
進行迭代遍歷的時候我們需要注意這種情況,就是在遍歷的過程中,如果我們對元素進行添加、刪除操作,那么會造成並行修改異常。對於這種情況,我們應當使用迭代器Iterator內部的remove()方法,而不是使用集合list直接刪除元素。

自定義集合

import java.util.Iterator;
public class MyCollection<E> implements Iterable<E> {
    @SuppressWarnings("unchecked")
    @Override
    public Iterator iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E>{
        @Override
        public boolean hasNext() {
            return false;
        }

        @Override
        public E next() {
            return null;
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM