Iterable接口

Iterable接口

總覽

這個接口用來代表能夠進行迭代。具體的迭代方式,能夠經過iterator()方法獲取到一個迭代器,在迭代器中會實現如何獲取下一個元素,以及是否迭代結束。java

java8中源碼以下:segmentfault

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
 
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

 

 

能夠看到在接口中主要有3個方法ui

  1. Iterator iterator(); 用來返回一個 Iterator
  2. forEach, 存在一個默認實現,很明顯能夠看到就是用來遍歷Iterable中的全部元素
  3. spliterator, 返回來返回一個Spliterator, 用來代表如何對元素進行分割

Iterable 和 Iterator

從字面意思來看: Iterable 具備迭代能力的; Iterator 迭代器 Iterable的派生類都是具備迭代能力的,具備迭代能力的前提是,須要實現一個Iterator對象來代表如何進行迭代。this

爲何將Iterable和Iterator分開

  1. 能夠很明顯的預測到,集合類會做爲參數,在各個方法中進行傳遞。若是在集合類中耦合迭代器,那麼在各個方法中進行遍歷的時候,都會對迭代器的位置信息進行修改。當後續進行使用的時候,會不清楚當前迭代器的位置在哪裏,則每次使用以前,須要reset一下位置,而後纔敢繼續使用。
  2. 因此將二者分離的好處就提現出來了,每次從集合類中獲取Iterator的時候,集合類new一個新的Iterator返回,每次都是從初始位置開始。

forEach 方法

default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

 

 

Java8中新增的方式,方法前面加了default 代表這是一個默認方法,關於默認方法,能夠看這篇文章.spa

方法的內容很簡單,遍歷每個元素,對每一個元素執行傳入的操做。  注意一點: 若是在執行傳入操做的時候,拋異常了,那麼會中端遍歷的執行。code

Spliterator接口

  • 參考文章1文章2
  • Spliterator接口是用來明確以何種方式將集合分割成多個小集合的,分割成小集合的目的是爲了進行並行計算
  • 看一下Spliterator接口
public interface Spliterator<T> {

    boolean tryAdvance(Consumer<? super T> action);

    default void forEachRemaining(Consumer<? super T> action) {
        do { } while (tryAdvance(action));
    }

    Spliterator<T> trySplit();

    long estimateSize();

    default long getExactSizeIfKnown() {
        return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
    }

    int characteristics();

    default boolean hasCharacteristics(int characteristics) {
        return (characteristics() & characteristics) == characteristics;
    }

    default Comparator<? super T> getComparator() {
        throw new IllegalStateException();
    }

    public static final int ORDERED    = 0x00000010;
    public static final int DISTINCT   = 0x00000001;
    public static final int SORTED     = 0x00000004;
    public static final int SIZED      = 0x00000040;
    public static final int NONNULL    = 0x00000100;
    public static final int IMMUTABLE  = 0x00000400;
    public static final int CONCURRENT = 0x00001000;
    public static final int SUBSIZED = 0x00004000;

}

 

 

其中比較重要的是trySplit方法,用來代表如何進行分割。對象

相關文章
相關標籤/搜索