为什么 Optional<T> 没有实现 Supplier<T>?
Why does Optional<T> not implement Supplier<T>?
我们都知道Optional<T>
有个方法T get()
,为什么不实现Supplier<T>
呢?
如果碰巧没有任何原因,如果 Oracle 将它实现到 Java 的未来版本中,它会破坏任何以前的代码吗?
这是因为它们的意思不同。
Optional<T>
是一个可以提供也可以不提供的参数,一个可以提供也可以不提供的 return 值,或者一个可以赋值也可以不赋值的变量。如果它有值,您可以使用 .get()
来检索它。 .get()
如果 你 做错了什么,即如果你在值不存在时调用它,则可能会抛出异常。
A Supplier<T>
是一个函数对象,它将根据需要提供一个值(或空值)。与 Optional<T>
不同,每次调用时 Supplier.get()
到 return 不同的值是合理的。如果 Supplier.get()
抛出异常,这意味着它的实现出了问题,而不是调用者犯了错误。
与 一样,Optional
没有合乎逻辑的理由实施 Supplier
。然而,Java 的方法引用使得共享相同功能签名的接口之间的转换变得非常容易。给定一个 Optional<T> o
,您可以将它以 o::get
.
的形式传递给任何需要 Supplier<T>
的方法或变量
java.util.function 包中的 None 个接口实现了 类(至少 Java 平台 类)。我认为这是因为这些接口不是为任何其他目的而设计的,而是像包描述所说的那样,为 lambda 表达式和方法引用提供目标类型。
我们都知道Optional<T>
有个方法T get()
,为什么不实现Supplier<T>
呢?
如果碰巧没有任何原因,如果 Oracle 将它实现到 Java 的未来版本中,它会破坏任何以前的代码吗?
这是因为它们的意思不同。
Optional<T>
是一个可以提供也可以不提供的参数,一个可以提供也可以不提供的 return 值,或者一个可以赋值也可以不赋值的变量。如果它有值,您可以使用 .get()
来检索它。 .get()
如果 你 做错了什么,即如果你在值不存在时调用它,则可能会抛出异常。
A Supplier<T>
是一个函数对象,它将根据需要提供一个值(或空值)。与 Optional<T>
不同,每次调用时 Supplier.get()
到 return 不同的值是合理的。如果 Supplier.get()
抛出异常,这意味着它的实现出了问题,而不是调用者犯了错误。
与 Optional
没有合乎逻辑的理由实施 Supplier
。然而,Java 的方法引用使得共享相同功能签名的接口之间的转换变得非常容易。给定一个 Optional<T> o
,您可以将它以 o::get
.
Supplier<T>
的方法或变量
None 个接口实现了 类(至少 Java 平台 类)。我认为这是因为这些接口不是为任何其他目的而设计的,而是像包描述所说的那样,为 lambda 表达式和方法引用提供目标类型。