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