内容简介:接上篇文章进一步分析java迭代器 spliterator 。
传送门:Java迭代器spliterator
https://mp.weixin.qq.com/s/lE7a1oP4jVdDe8T13GXHbA在上篇文章中,已经使用 int 数组简单说明了 java 8 中 Spliterator 的使用,上篇文章还有以下几个问题还没有解决:
Arrays类使用的 spliterator 具体实现由哪些
以上具体实现中 Consumer 有哪些类型
集合是否提供了 spliterator 操作
具体实现
如上图所示, Arrays 的 spliterator 函数提供了4中参数类型,对应不同的参数,底层有4中实现。
参数类型为 T 时,底层的实现为 ArraySpliterator; 参数类型为 int 时,底层实现为 IntArraySpliterator; 参数类型为 long 时,底层实现为 LongArraySpliterator; 参数类型为 double 时,底层实现为 DoubleArraySpliterator;
上图为4种底层实现类的继承结构。
使用泛型参数,顶层接口 Spliterator.OfPrimitive 仅仅声明了了 trySplit 和 tryAdvance 方法,并提供了 forEachRemaining 方法的默认实现。
ArraySpliterator 是比较特殊的,它底层存储的是 Object 类型的数组,并且直接实现了 Spliterator 接口。相较于 Spliterator.OfPrimitive 接口, Spliterator 接口需要子类实现的方法包括 trySplit , tryAdvance, estimateSize()。
Spliterator 接口和 Spliterator.OfPrimitive 接口的最大区别就是 Spliterator 接口是为了分割迭代 Object 类型数组, Spliterator.OfPrimitive 接口是为了分割迭代 int ,long ,double 类型数组。
Consumer
Arrays 提供了4中参数类型的 spliterator 函数,实现原理是一样,但是在执行 tryAdvance 和 forEachRemaining 时传递的 Consumer 类型不一样,对应于 Arrays 勒种4中不同的 Spliterator , java 8 提供了四种类型的 Consumer :
Consumer
IntConsumer
LongConsumer
DoubleConsumer
Consumer 针对的数据类型为 Object ;
IntConsumer , LongConsumer , DoubleConsumer 分别针对数据类型 int, long, double。
以上四种Consumer接口都申明了accept 方法,并提供了andThen的默认框架实现。
集合的分割迭代
Iterable 接口是集合类的顶层接口,从 java 8开始,Iterable 增加了 spliterator 和 forEach方法,故所有的 Iterable 具体实现都可以使用 spliterator 方法进行分割迭代。
由于集合内部存储的基本类型的数据都会被自动装箱,故 forEach 方法的参数是接收 Object 类型的 Consumer 。
--END--
识别二维码,关注我们