何时使用 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
是一个接受另一个函数的函数,从 Double
到 Option[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 double
,Optional<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。
好像是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
是一个接受另一个函数的函数,从 Double
到 Option[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 double
,Optional<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。