为什么 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 表达式和方法引用提供目标类型。