我们都知道Optional<T>有一个方法T get(),那么为什么它不实现Supplier<T>呢?
如果碰巧没有理由,如果Oracle将其实现为Java的未来版本,它会破坏以前的代码吗?
发布于 2017-10-17 04:51:11
因为它们的意义不同。
Optional<T>是一个参数,它可以提供也可以不提供,返回值可以提供也可以不提供,或者变量可以或者不被赋值。如果它有一个值,您可以使用.get()检索它。如果.get()您的做错了什么,即当值不存在时调用它,那么可能会抛出异常。
Supplier<T>是一个函数对象,它将根据需要提供一个值(或null)。与Optional<T>不同,Supplier.get()在每次调用它时返回不同的值是合理的。如果Supplier.get()抛出异常,这意味着它的实现出了问题,而不是调用方犯了错误。
发布于 2017-10-17 05:01:06
作为@MattTimmermans explains,Optional没有实现Supplier的逻辑理由。但是,Java的方法引用使得在共享相同功能签名的接口之间进行转换变得非常容易。给定一个Optional<T> o,您可以将它传递给任何期望以o::get形式表示Supplier<T>的方法或变量。
发布于 2017-10-17 05:51:05
java.util.function包中没有一个接口有实现类(至少是Java类)。我认为这是因为这些接口不是为任何其他目的而设计的,而是像包描述所说的那样,为lambda表达式和方法引用提供目标类型。
https://stackoverflow.com/questions/46782459
复制相似问题