java - spliterator getExactSizeIfKnown 与estimateSize

标签 java java-8 java-stream spliterator

这是在我编写自定义 Spliterator 时出现的。我知道如果我知道尺寸,即使是近似尺寸,我应该覆盖estimateSize。通常,我会这样做。但是还有 getExactSizeIfKnown 并且我了解它的默认实现:

default long getExactSizeIfKnown() {
    return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}

现在,假设我正在开发一个ArrayListSpliterator(我知道它已经存在,但这不是重点)。我应该覆盖 getExactSizeIfKnownestimateSize 还是两者都覆盖?

在内部,我猜实际上调用了 getExactSizeIfKnown不是 estimateSize - 因为第一个委托(delegate)给了第二个。考虑到理论上我正在开发一个ArrayListSpliterator,重写getExactSizeIfKnown实际上不会让我为一个额外的方法调用付出代价 - 绕道getExactSizeIfKnown -> estimateSize

最佳答案

“我应该覆盖 getExactSizeIfKnownestimateSize 还是两者都覆盖?”的答案也就是说,您必须实现estimateSize,因为它是抽象。如果您发现原因,还可以重写default方法getExactSizeIfKnown

Internally, I guess getExactSizeIfKnown is actually called, not estimateSize - since the first one delegates to the second.

事情没那么简单。请为调用 getExactSizeIfKnown 的代码做好准备,因为只有在准确且未检查特征的情况下,它才可能使用该数字。但同时可能有其他代码调用 estimateSize,因为它想要估计,或者因为它将在另一个地方处理特征。事实上,一个有一个默认实现,可以在某种条件下委托(delegate)给另一个实现,这一事实并不能说明调用者的任何情况。这些方法具有不同的语义。

Taking into consideration that theoretically I am working on a ArrayListSpliterator, will not overriding getExactSizeIfKnown actually just make me pay for one extra method call - the detour getExactSizeIfKnown -> estimateSize?

条件可能比委托(delegate)调用更有害,但如果您的特定 Spliterator 始终返回相同的特征,JVM 的优化器可能会消除与此相关的任何开销。因此,这是通常的权衡,在这里,与微小的开发工作相比,微小的潜在性能优势(提供仅返回已知数字的附加方法)。

如果大小的计算并不简单,那么无论如何您都会以委托(delegate)结束,因为您不希望重复重要的代码。如果您的类的设计方式并不总是存在 SIZED 特征,那么您无论如何都会执行与 default 方法完全相同的操作。

关于java - spliterator getExactSizeIfKnown 与estimateSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641868/

相关文章:

java - 为什么使用 MapFragment 而不是 SupportMapFragment?

java - 如何将内部元素从流添加到流?

java - 如何过滤 TreeMap<MyKey, Map<Key2,List<Kids>>> ,

.map 返回的 Java-8 Stream 是并行的还是顺序的?

java - zk - 文件上传前的 java 文本框验证

JAVA_HOME设置错误

java - Eclipse Luna 的 Scala 插件

java - Lambda 表达式与 lambdaj

java - 我想将 computeIfPresent 和 putIfAbsent 都放到一个原子函数中

java - 我什么时候应该使用流?