天天看點

java.util.Spliterator源碼解析

1. 介紹

​ 可分割疊代器,用來把原來的對象元素進行分割和周遊,也可能會修改元素。可以用​

​tryAdvance​

​​來操作一個元素,可以用​

​forEachRemaining​

​​來批量操作元素。Spliterator可以用​

​trySplit​

​來分割元素,傳回另一個Spliterator,用在并發操作中,相當于遞歸,分而治之。如果Spliterator不能分割或者分割後元素非常不均衡或者是效率差,将不會從并發操作中受益。

Spliterator有一些特征:ORDERED,DISTINCT,SORTED,SIZED,NONNULL,IMMUTABLE,CONCURRENT,SUBSIZED,這些特征會作為交集表現出來。某些特征也限制了某些方法的操作。

jdk1.8加入

2. tryAdvance

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

如果有其它元素,對一個元素執行action

3. forEachRemaining

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

對于剩餘的元素,在目前線程中按序執行action

4. trySplist

<T> trySplit();      

如果這個spliterator可以被分割,傳回分割後的疊代器,疊代器會包含目前的一部分元素,如果不能被分割,傳回null

5. estimateSize

long estimateSize();      

傳回目前要處理的元素的數量,如果為無窮大或者未知的或者無法計算,傳回Long.MAX_VALUE

6. getExactSizeIfKnown

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

如果特征為​

​SIZED​

​​傳回​

​estimateSize​

​​否則傳回​

​-1​

7. characteristics

int characteristics();      

傳回集合的特征。通過判斷集合的特征,可以更好的做運算

8. hasCharacteristics

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

集合是否擁有某個特征

9. getComparator

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

如果疊代器的源是​

​SORTED​

​​,如果有​

​Comparator​

​​傳回原來的,如果沒有傳回null,如果不是​

​SORTED​

​抛出異常

10. ofPrimitive

public interface OfPrimitive<T, T_CONS, T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>>
            extends Spliterator<T> {
        @Override
        T_SPLITR trySplit();


        @SuppressWarnings("overloads")
        boolean tryAdvance(T_CONS action);


        @SuppressWarnings("overloads")
        default void forEachRemaining(T_CONS action) {
            do { } while (tryAdvance(action));
        }
    }      

包裝了一下

繼續閱讀