我试图了解 Optional<T>.orElse()
和 Optional<T>.orElseGet()
方法之间的区别。
orElse()
方法的描述是 “如果存在则返回值,否则返回其他”。
而 orElseGet()
方法的描述是 “如果存在则返回值,否则调用其他方法并返回该调用的结果。”
orElseGet()
方法采用 Supplier 功能接口,基本上不采用任何参数并返回 T
。
在哪种情况下您需要使用 orElseGet()
?如果你有一个方法 T myDefault()
你为什么不做 optional.orElse(myDefault())
而不是 optional.orElseGet(() -> myDefault())
?
似乎 orElseGet()
将 lambda 表达式的执行推迟到以后的某个时间或其他时间,那么它有什么意义呢? (I would have thought that it would be more useful if it returned a safer Optional<T>
whose get()
never throws a NoSuchElementException
and isPresent()
always返回 true… 但显然不是,它只是返回 T
就像 orElse()
)。
我还缺少其他区别吗?
原文由 jbx 发布,翻译遵循 CC BY-SA 4.0 许可协议
以这两种情况为例:
如果
opt
不包含值,则两者确实等价。但是,如果opt
包含 一个值,将创建多少Foo
对象?Ps:当然在这个例子中,差异可能无法衡量,但是如果您必须从远程 Web 服务或数据库中获取默认值,它突然变得非常重要。