all

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

发布于 2022-05-26 23:03:10

我试图了解Optional<T>.orElse()Optional<T>.orElseGet()方法之间的区别。

orElse()方法的描述是 “如果存在则返回值,否则返回其他值”。

同时,该orElseGet()方法的描述是 “如果存在则返回值,否则调用其他值并返回该调用的结果。”

orElseGet()方法采用 Supplier 功能接口,该接口本质上不带任何参数并返回T

在什么情况下需要使用orElseGet()?如果你有一个方法T myDefault(),你为什么不直接做optional.orElse(myDefault())而不是optional.orElseGet(() -> myDefault())

似乎并没有orElseGet()将 lambda
表达式的执行推迟到以后的某个时间或什么的,那么它有什么意义呢?(我原以为如果它返回一个更安全Optional<T>的,它get()从不抛出
aNoSuchElementException并且isPresent()总是返回 true
会更有用......但显然它不是,它只是像返回T一样orElse())。

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

关注者
0
被浏览
9
1 个回答
  • 面试哥
    面试哥 2022-05-26
    为面试而生,有面试问题,就找面试哥。

    采取这两种情况:

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

    如果opt不包含值,则两者确实是等价的。但如果opt 确实 包含一个值,Foo会创建多少个对象?

    Ps:当然,在这个例子中,差异可能无法测量,但如果你必须从远程 Web 服务或数据库中获取默认值,它突然变得非常重要。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看