我试图了解 Optional<T>.orElse()
之间的区别和 Optional<T>.orElseGet()
方法。
orElse()
的描述方法是“如果存在则返回值,否则返回其他值。”
同时,orElseGet()
的描述方法是“如果存在则返回值,否则调用其他值并返回该调用的结果。”
orElseGet()
方法采用 Supplier 功能接口(interface),该接口(interface)本质上不带任何参数并返回 T
.
在什么情况下需要使用orElseGet()
?如果你有方法T myDefault()
你为什么不直接做optional.orElse(myDefault())
而不是 optional.orElseGet(() -> myDefault())
?
似乎 orElseGet()
将 lambda 表达式的执行推迟到以后的某个时间或什么的,那么它有什么意义呢? (我原以为如果它返回一个更安全的 Optional<T>
其 get()
永远不会抛出 NoSuchElementException
并且 isPresent()
总是返回 true 会更有用......但显然不是,它只是返回 T
像 orElse()
)。
我还缺少其他一些区别吗?
最佳答案
采取这两种情况:
Optional<Foo> opt = ...
Foo x = opt.orElse( new Foo() );
Foo y = opt.orElseGet( Foo::new );
如果 opt
不包含值,则两者确实是等价的。但是如果 opt
确实 包含一个值,那么会创建多少个 Foo
对象?
P.s.:当然,在这个例子中,差异可能无法测量,但如果你必须从远程 Web 服务或数据库中获取默认值,它突然变得非常重要。
关于java - `Optional.orElse()` 和 `Optional.orElseGet()` 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33170109/