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
