spliterator()


spliterator()

文檔說明

  • 創建一個 分割迭代器 (方法定義在 Iterable 接口)
  • 實現類需要記錄 spliterator 報告的 characteristic 值
    • 但當 spliterator 報告了 size 或當前集合容器中無元素時,這個 characteristic值則無需報告
  • 默認的實現需要被子類重寫,返回一個更加高效的 spliterator
    • 為了保留期望的 stream() 和 parallelStream() 的延遲行為,分割迭代器需要具有 IMMUTABLE 或 CONCURRENT 特性,或者設置為延遲綁定的(late-binding)
    • 如果上述要求都無法實現,則重寫的類需要去描寫該分割迭代器的文檔化的綁定策略,以及可能出現的修改的行為,並且還需要重寫 stream() 和 parallelStream() 方法,通過 spliterator 的 Supplier 去創建流
    • 這些要求確保了由 stream() 或 parallelStream() 生成的流在終止操作執行時能夠反映出集合的內容
    • 默認的實現是從集合的 Iterator 中創建了一個延遲綁定的 spliterator,這個 spliterator 繼承了迭代器的 fail-fast(快速失敗)屬性
    • 所創建出來的 spliterator 會包含 SIZED 特性值
    • 同時,此 spliterator 還具有 SUBSIZED 特性值
    • 若一個 spliterator 中沒有元素,則特性值報告不會幫助客戶端對 SIZED 與 SUBSIZED 以外的特性值進行控制、或進行專門的簡化計算
    • 這樣可以確保了可以對空集合共享使用一個不可變的空的 spliterator 實例,並且可以確保客戶能夠判定該 spliterator 是否不包含任何元素

源碼

Collection 中的 spliterator(),調用 Spliterators 的 spliterator() 方法,並將當前集合的引用傳入

@Override
default Spliterator<E> spliterator() {
    return Spliterators.spliterator(this, 0);
}

 Spliterators

  • 靜態類,以及方法,用於操作和創建 Spliterator 實例及其它原生特化實例

spliterator 方法

public static <T> Spliterator<T> spliterator(Collection<? extends T> c, int characteristics) {
    return new IteratorSpliterator<>(Objects.requireNonNull(c), characteristics);
}

文檔說明

  • 基於 Iterator 的 spliterator
  • 使用給定集合的 iterator() 作為數據源,並且將 size() 返回的值作為初始大小,創建一個  Spliterator
  • 此 spliterator 是延遲綁定的,繼承了集合的迭代器的“快速失敗”的特性,並且實現了  trySplit() 用於有限的並行化

IteratorSpliterator

Spliterators 的內部類

文檔說明

  • 一個使用了一個給定 Iterator 的 Spliterator 進行元素的操作,實現  trySplit() 用於有限的並行化
  • 持有所操作的集合對象的引用
public IteratorSpliterator(Collection<? extends T> collection, int characteristics) {
    this.collection = collection;
    this.it = null;
    this.characteristics = (characteristics & Spliterator.CONCURRENT) == 0
                           ? characteristics | Spliterator.SIZED | Spliterator.SUBSIZED
                           : characteristics;
}
  • 創建一個 spliterator,使用給定的集合的迭代器進行遍歷,並且將集合 size() 作為初始的 size


免責聲明!

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



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