天天看点

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));
        }
    }      

包装了一下

继续阅读