package java.util;
import java.util.function.Consumer; //函数接口
import java.util.function.DoubleConsumer;
import java.util.function.IntConsumer;
import java.util.function.LongConsumer;
//分割迭代器,分割io流,数组等,可以用于分治并发提高性能
public interface Spliterator<T> {
// Consumer<? super T> action表示一个函数接口定义的函数
// 如果还有元素存在,对下一个元素执行action
boolean tryAdvance(Consumer<? super T> action);
//在当前线程,串行对剩下所有的元素执行函数action
default void forEachRemaining(Consumer<? super T> action){
do { } while (tryAdvance(action));
}
//如果此 Spliterator 可以被分割,则会返回一个包含部分元素的 Spliterator,
// 然后从此方法返回,从此方法返回的 Spliterator 中的元素,将从当前 Spliterator 中分离出去
Spliterator<T> trySplit();
//返回会被 forEachRemaining 操作的元素的数量的估算值,
//若元素是无限的、未知的、或者是计算成本过高的,会返回一个最大值(MAX_VALUE)
long estimateSize();
//如果spliterator是sized的,就返回estimateSize的结果(这个是准确的数量),否则返回-1
default long getExactSizeIfKnown(){
return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}
// 返回这个spliterator的元素的特征的集合。
// 结果被表达成ORDERED,DISTINCT,SORTED,SIZED,NONNULL,IMMUTABLE,CONCURRENT,SUBSIZED的或值。
// 在trySplit前或者两个trySplit之前重复调用characteristics应该总是返回相同的结果。
// 如果一个spliterator报告一个不一致的特征集合(不管返回给一个调用或者多个调用),使用这个spliterator不能保证任何计算
// 一个spliterator的特征在分割前和分割后可能不同。典型的例子是sized,subsized,concurrent
int characteristics();
// 如果这个spliterator包含了给定的所有特征,返回true
default boolean hasCharacteristics(int characteristics){
return (characteristics() & characteristics) == characteristics;
}
// 如果spliterator的来源是sorted,且通过一个comparator排序,则返回这个comparator。
// 如果来源是sorted,以自然地顺序,返回null。
// 然而,如果来源不是sorted,抛出IllegalStateException。
default Comparator<? super T> getComparator(){
throw new IllegalStateException();
}
// 特征值:代表着为元素定义了顺序。如果这样,spliterator保证trySplit严格地按照元素的前缀分割。
// tryAdvance以前缀的顺序,一次前进一个元素。forEachRemaining以相遇的顺序执行操作。
public static final int ORDERED = 0x00000010;
//特征值:两两元素都不相同,基于set集合的分割迭代器
public static final int DISTINCT = 0x00000001;
//特征值:根据一个比较器定义了顺序
public static final int SORTED = 0x00000004;
//特征值:代表着在遍历或者分割前返回的estimateSize代表了一个有限的大小
public static final int SIZED = 0x00000040;
//特征值:代表着迭代器迭代过程中的元素不会null
public static final int NONNULL = 0x00000100;
//特征值:代表着迭代器的数据源不能改变(增删改)
public static final int IMMUTABLE = 0x00000400;
//特征值,代表着元素的来能可能被安全地,并发地修改,(允许增加,代替,和/或者删除)通过没有多余同步的多线程
public static final int CONCURRENT = 0x00001000;
// 特征值,代表着所有的通过trySplit产生的spliterator都是sized和subsized。
// 这意味着所有的子spliterator,无论是亲的或者不亲的,都是sized的
public static final int SUBSIZED = 0x00004000;
//针对不同java数据类型设计的分割迭代器:重写方法意义同上**************************************************************//
//内部接口 一个专门为基本类型的分割迭代器
// * @param <T> 被这个spliterator返回的元素的类型。这个类型必须是一个基本类型的包装类,例如Integer对于基本类型int。
// * @param <T_CONS> 原始的conumser的类型。这个类型必须是对T的consumer类的基本实例。例如IntConsumer对于Integer、
// * @param <T_SPLITR> 基本spliterator的类型。这个类型必须是对T的spliterator的基本实例,例如Spliterator.OfInt对于Integer
// * <p>这个类里重写了trySplit,返回T_SPLITR类型的spliterator。
// * <p>还增加了两个方法tryAdvance,forEachRemaining,里面的参数为T_CONS
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));
}
}
//内部接口:为Integer提供的分割迭代器****************************************************************//
public interface OfInt extends OfPrimitive<Integer, IntConsumer, OfInt> {
@Override
OfInt trySplit();
@Override
boolean tryAdvance(IntConsumer action);
@Override
default void forEachRemaining(IntConsumer action){
do { } while (tryAdvance(action));
}
@Override
default boolean tryAdvance(Consumer<? super Integer> action){
if(action instanceof IntConsumer){
return tryAdvance((IntConsumer) action);
}else{
if(Tripwire.ENABLED)
Tripwire.trip(getClass(),
"{0} calling Spliterator.OfInt.tryAdvance((IntConsumer) action::accept)");
return tryAdvance((IntConsumer) action::accept);
}
}
@Override
default void forEachRemaining(Consumer<? super Integer> action){
if(action instanceof IntConsumer){
forEachRemaining((IntConsumer) action);
}else{
if(Tripwire.ENABLED)
Tripwire.trip(getClass(),
"{0} calling Spliterator.OfInt.forEachRemaining((IntConsumer) action::accept)");
forEachRemaining((IntConsumer) action::accept);
}
}
}
//为 Long类型设计的分割迭代器*******************************************************//
public interface OfLong extends OfPrimitive<Long, LongConsumer, OfLong> {
@Override
OfLong trySplit();
@Override
boolean tryAdvance(LongConsumer action);
@Override
default void forEachRemaining(LongConsumer action){
do { } while (tryAdvance(action));
}
@Override
default boolean tryAdvance(Consumer<? super Long> action){
if(action instanceof LongConsumer){
return tryAdvance((LongConsumer) action);
}else{
if(Tripwire.ENABLED)
Tripwire.trip(getClass(),
"{0} calling Spliterator.OfLong.tryAdvance((LongConsumer) action::accept)");
return tryAdvance((LongConsumer) action::accept);
}
}
@Override
default void forEachRemaining(Consumer<? super Long> action){
if(action instanceof LongConsumer){
forEachRemaining((LongConsumer) action);
}else{
if(Tripwire.ENABLED)
Tripwire.trip(getClass(),
"{0} calling Spliterator.OfLong.forEachRemaining((LongConsumer) action::accept)");
forEachRemaining((LongConsumer) action::accept);
}
}
}
//为 Double 类型设计的分割迭代器*******************************************************//
public interface OfDouble extends OfPrimitive<Double, DoubleConsumer, OfDouble> {
@Override
OfDouble trySplit();
@Override
boolean tryAdvance(DoubleConsumer action);
@Override
default void forEachRemaining(DoubleConsumer action){
do { } while (tryAdvance(action));
}
@Override
default boolean tryAdvance(Consumer<? super Double> action){
if(action instanceof DoubleConsumer){
return tryAdvance((DoubleConsumer) action);
}else{
if(Tripwire.ENABLED)
Tripwire.trip(getClass(),
"{0} calling Spliterator.OfDouble.tryAdvance((DoubleConsumer) action::accept)");
return tryAdvance((DoubleConsumer) action::accept);
}
}
@Override
default void forEachRemaining(Consumer<? super Double> action){
if(action instanceof DoubleConsumer){
forEachRemaining((DoubleConsumer) action);
}else{
if(Tripwire.ENABLED)
Tripwire.trip(getClass(),
"{0} calling Spliterator.OfDouble.forEachRemaining((DoubleConsumer) action::accept)");
forEachRemaining((DoubleConsumer) action::accept);
}
}
}
}