转载

Java 迭代器 spliterator(二)

内容简介:接上篇文章进一步分析java迭代器 spliterator 。

传送门:Java迭代器spliterator

https://mp.weixin.qq.com/s/lE7a1oP4jVdDe8T13GXHbA

在上篇文章中,已经使用 int 数组简单说明了 java 8 中 Spliterator 的使用,上篇文章还有以下几个问题还没有解决:

  • Arrays类使用的 spliterator 具体实现由哪些

  • 以上具体实现中 Consumer 有哪些类型

  • 集合是否提供了 spliterator 操作

具体实现

Java 迭代器 spliterator(二)

如上图所示, Arrays 的 spliterator 函数提供了4中参数类型,对应不同的参数,底层有4中实现。

参数类型为 T 时,底层的实现为 ArraySpliterator; 参数类型为 int 时,底层实现为 IntArraySpliterator; 参数类型为 long 时,底层实现为 LongArraySpliterator; 参数类型为 double 时,底层实现为 DoubleArraySpliterator;

Java 迭代器 spliterator(二)

上图为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--

识别二维码,关注我们

Java 迭代器 spliterator(二)

原文  https://mp.weixin.qq.com/s/ozUP4qKze29wT2_KWw8sfA
正文到此结束
Loading...