当前位置: 首页 > 知识库问答 >
问题:

`optional.orelse()`与`optional.orelseget()`之间的差异

王翰墨
2023-03-14

orelseget()方法接受一个供应商函数接口,该接口本质上不接受任何参数,并返回T

在哪种情况下需要使用orelseget()?如果您有一个方法tMyDefault()为什么不直接执行optional.orelse(myDefault())而不执行optional.orelseGet(()->myDefault())

orelseget()似乎并不是要将lambda表达式的执行推迟到以后的某个时间或其他时间,那么这有什么意义呢?(我认为如果它返回一个更安全的可选 会更有用,它的get()从不抛出nosuchelementexception并且ispresent()总是返回true...但显然它不是,它只是返回t,就像orelse())。

是不是还有什么我遗漏的不同之处?

共有1个答案

秦哲瀚
2023-03-14

以以下两种情况为例:

Optional<Foo> opt = ...
Foo x = opt.orElse( new Foo() );
Foo y = opt.orElseGet( Foo::new );

如果opt不包含值,则两者实际上是等价的。但是,如果opt确实包含一个值,那么将创建多少foo对象?

附注:当然,在本例中,这种差异可能无法测量,但如果您必须从远程web服务(例如)或数据库中获取默认值,它突然变得非常重要。

 类似资料: