java - `Optional.orElse()` 和 `Optional.orElseGet()` 之间的区别

标签 java java-8 option-type

我试图了解 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 会更有用......但显然不是,它只是返回 TorElse() )。

我还缺少其他一些区别吗?

最佳答案

采取这两种情况:

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/

相关文章:

string - Swift nil 可选字符串 = 空字符串

swift - 为什么 Swift 的 enumerateSubstringsInRange 回调采用可选字符串?

java - 创建 WebMVCConfig 资源 [/com.chat.config/] 中定义的名称为 'resolver' 的 bean 时出错

java - 给定类路径中包含相同类但 JRE 版本不同的 jar,Java 如何知道在运行时使用哪个类?

Java 8 Streams map API - 方法引用解读

java - 使用 Mockito,我如何验证我的 lambda 表达式被调用了?

swift - 为什么可选常量不会自动具有默认值 nil

Java:使用short代替int

java - 将.gif图像转换为base64以上传到服务器

java - 我想给 mysql 提供 JDBC 连接。我不希望在我的类(class) people() 中拥有数据值