从底层,从原理,我们来重学一次 Java。Stream 是 JDK 8 中新引入的,方便了数据列表的过滤、投影、遍历等各种处理,他的源码及实现是怎样的呢?
本系列秉承所有结论尽量从源码中来,没有源码的尽量标明出处。相关源码会附着在文章中,读本文即可,不用再自行查找源码及资料学习,方便大家充分利用路上的碎片时间。
分离器(Spliterator)用于遍历和切分集合元素,终端操作遍历直接就是调用分离器的遍历方法,并行处理是用分离器进行并行任务切分的。例如:Arrays.stream内部返回的 StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false),第一个参数就是分离器(Spliterator)。
Sink 是在 Stream 的终端操作(如 forEach)进行处理时,AbstractPipeline.wrapSink 方法向上遍历管道阶段时,中间管道阶段 opWrapSink 方法实现返回的接口。过滤(filter)、投影(map)、排序(sorted)等中间操作的核心代码均写在 Sink 的接口实现中,可见Sink的重要性。
本篇 Chat 分析了分离器(Spliterator)相关源码,以及 Sink 源码,帮助大家深入理解和学习 JDK 源码。
本文包含以下内容:
- Spliterators
- spliterator(Collection c, int characteristics)
- Objects.requireNonNull(T obj)
- Spliterators.spliteratorUnknownSize(Iterator iterator, int characteristics)
- IteratorSpliterator
- 类定义
- 常量
- 构造函数
- IteratorSpliterator(Collection collection, int characteristics)
- IteratorSpliterator(Iterator iterator, long size, int characteristics)
- IteratorSpliterator(Iterator iterator, int characteristics)
- Spliterator
- 类的定义
- 方法
- tryAdvance(Consumer action)
- forEachRemaining(Consumer action)
- trySplit()
- estimateSize()
- getExactSizeIfKnown()
- characteristics()
- hasCharacteristics(int characteristics)
- getComparator()
- 常量
- ORDERED
- DISTINCT
- SORTED
- SIZED
- NONNULL
- IMMUTABLE
- CONCURRENT
- SUBSIZED
- Spliterator.OfPrimitive
- Spliterator.OfInt
- Spliterator.OfLong
- Spliterator.OfDouble
- Tripwire
- 类的定义
- ENABLED
- trip(Class<?> trippingClass, String msg)
- ArraySpliterator
- 属性
- 构造函数
- trySplit
- forEachRemaining
- tryAdvance
- estimateSize
- characteristics
- getComparator
- Sink
- 接口定义
- 接口继承结构
- begin(long size)
- end()
- cancellationRequested()
- accept(int value)
- accept(long value)
- accept(double value)
- OfInt
- OfLong
- OfDouble
- ChainedReference
- ChainedInt
- ChainedLong
- ChainedDouble
适用人群:有一些 Java 基础的人群。