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