何时使用 Optional<T> 与 OptionalT in JDK 8+(其中 T 是盒装原始类型)?

When to use Optional<T> vs OptionalT in JDK 8+ (where T is boxed primitive type)?

好像是performance reasons OptionalDouble does not simply extend Optional<Double>? IMO,这是一个不应该泄露到 SDK 设计中的性能问题,但我离题了。

作为图书馆作者,我应该向我的用户公开哪一个,Optional<T> 还是 OptionalT?哪些因素会让我决定何时使用哪一个?

编辑: 根据评论,详细说明我的特定用例。我正在编写通往 Scala ML 库的桥梁,以便人们可以从 Java 8+.

使用它

简化后的 Scala 签名如下所示:

def flattenBy(f: Double => Option[Double]): List[Double]

对于那些不熟悉 Scala 的人来说,flattenBy 是一个接受另一个函数的函数,从 DoubleOption[Double] 和 returns 一个 List Doubles.

此映射到 Java 8 中最接近的签名是什么?

在我看来最接近的签名是:

List<Double> flattenBy(DoubleFunction<OptionalDouble> f)

如果双打必须有一个身份和一个值,您只需要使用 Optional<Double>(听起来您不需要这个)。

It seems for performance reasons OptionalDouble does not simply extend Optional? IMO, that's a perf concern that should not have leaked into SDK design but I digress.

这与链接的答案不完全相同。它解释说 OptionalDouble 存在 根本 因为性能问题。但考虑到它不能扩展 Optional<Double> 因为签名不兼容:它的 get returns doubleOptional<Double> 的一个 returns Double.

如果您不关心 double 以外的类型,当然可以使用 OptionalDouble;但考虑到 List<Double> 的开销要大得多(3 times the memory use of double[] in this example)! There are many libraries providing real primitive collections for Java: e.g. HPPC, Trove, fastutil, Koloboke