我正在实现一个Spliterator
通过trySplit()
return明确限制并行化的方法null
。实施是否会estimateSize()
为此拆分器生成的流提供任何性能改进?还是估计的大小仅对并行化有用?
编辑:为了澄清,我特别询问估计大小。也就是说,我的分离器没有这个SIZED
特性。
我正在实现一个Spliterator
通过trySplit()
return明确限制并行化的方法null
。实施是否会estimateSize()
为此拆分器生成的流提供任何性能改进?还是估计的大小仅对并行化有用?
编辑:为了澄清,我特别询问估计大小。也就是说,我的分离器没有这个SIZED
特性。
查看相关拆分器特征的调用层次结构表明它至少与stream.toArray()
性能相关
此外,内部流实现中还有一个等效标志,似乎用于排序:
因此,除了并行流操作之外,大小估计似乎也用于这两个操作。
我并没有声称我的搜索详尽无遗,因此仅以这些为例。
如果没有 SIZED 特性,我只能找到estimateSize()
与流管道并行执行相关的调用。
当然,这可能会在未来发生变化,或者与标准 JDK 不同的另一种 Stream 实现可能会有所不同。
拆分器可以遍历元素:
1.个别(tryAdvance())
2.依次批量(forEachRemaining())
根据java docs estimateSize()
在拆分过程中会派上用场。
Spliterators 可以通过estimateSize() 方法估计剩余元素的数量。理想情况下,正如 SIZED 特性所反映的那样,该值与成功遍历中将遇到的元素数量完全对应。然而,即使在不完全知道的情况下,估计值仍然可能对在源上执行的操作有用,例如帮助确定进一步拆分或顺序遍历剩余元素是否更可取。
由于您的拆分器没有 SIZED 特性 estimateSize
,因此不会提供任何性能(因为没有并行性),但是请记住,Java-docs ofestimateSize
没有提到任何并行性,它只声明:
返回:估计的大小,或者 Long.MAX_VALUE 如果无限、未知或计算太昂贵。