0%

Spliterator

前言:之前看ArrayList源码时,碰到了Spliterator,今天就从源码学习一下

Spliterator简介

参考文档Spliterator (Java Platform SE 8 )

Spliterator是Java8新增的一个可分割迭代器(splitable iterator),用于并行处理,集合框架中的数据结构基本都默认实现了spliterator。

Spliterator类图如下

image-20200102002717488

方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public interface Spliterator<T> {
// 对单个元素执行给定的动作,如果有剩下元素未处理返回true,否则返回false
boolean tryAdvance(Consumer<? super T> action);

// 对每个剩余元素执行给定的动作,依次处理,直到所有元素已被处理或被异常终止。默认方法调用tryAdvance方法
default void forEachRemaining(Consumer<? super T> action) {
do { } while (tryAdvance(action));
}

// 对任务分割,返回一个新的Spliterator迭代器
Spliterator<T> trySplit();

// 用于估算还剩多少个元素需要遍历
long estimateSize();

// 当迭代器拥有SIZED特征时,返回剩余元素个数;否则返回-1
default long getExactSizeIfKnown() {
return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}

// 返回当前对象有哪些特征值
int characteristics();

// 是否具有当前特征值
default boolean hasCharacteristics(int characteristics) {
return (characteristics() & characteristics) == characteristics;
}

// 获取比较接口
default Comparator<? super T> getComparator() {
throw new IllegalStateException();
}

}

特征值

特征值具体代表的含义需要根据不同的实现类分析,不同的实现类,特征值是有区别的,比如ArrayList的内部实现类ArrayListSpliterator,它的特征值分别是ORDERED,SIZED,SUBSIZED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 特征值表示为元素定义遇到顺序
public static final int ORDERED = 0x00000010;

// 表示对于每对遇到的元素x和y:!x.equals(y)
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;

// 表示由所产生的所有Spliterator trySplit()都将SUBSIZED。
public static final int SUBSIZED = 0x00004000;

接口

Spliterator中OfDouble、OfInt、OfLong、OfPrimitive等接口,AbstractLongSpliterator、AbstractDoubleSpliterator等静态抽象类,这里就学习一下OfPrimitive

1
2
3
4
5
6
7
8
9
10
11
12
13
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));
}
}

泛型,Spliterator.OfPrimitive仅声明了trySplit和tryAdvance方法,提供了forEachRemaining方法的默认实现。

OfPrimitive本质上和Spliterator没有太大的区别,只不过,它限制tryAdvance的参数action类型T_CONS和trySplit的返回参数T_SPLITR必须在实现接口时先声明类型。

OfPrimitive又衍生出了OfInt、OfLong、OfDouble等专门用来处理int数组、Long数组、double数组等分割迭代器接口

-------------本文结束感谢您的阅读-------------