java.util.Optional.or() .orElse(), .orElseGet()的区别

java.util.Optional 是 Java 8 引入的一个容器类,用于表示一个可能包含或不包含非空值的对象。它提供了多种方法来处理可能为空的对象,从而避免使用null值。

Optional 中,.or(), .orElse(), 和 .orElseGet() 都是用于处理可能为空的值的方法,但是它们的行为和使用场景有所不同。

1. Optional.or(Supplier<? extends Optional<? extends T>> supplier)

  • 作用: 如果当前 Optional 为空(即不包含值),则返回一个由 supplier 提供的 Optional 对象。
  • 返回类型: 返回一个 Optional<T> 对象。
  • 使用场景: 通常用于连接多个Optional,其中每个Optional都可能为空,直到找到一个非空的Optional
  • 执行时机: 仅当原始Optional为空时才会调用 supplier,这意味着只有在需要时才会创建新的Optional对象(即惰性求值)。

示例

Optional<String> optional1 = Optional.empty();
Optional<String> optional2 = Optional.of("Hello");

Optional<String> result = optional1.or(() -> optional2);

System.out.println(result); // 输出: Optional[Hello]

在这个示例中,optional1 是空的,所以 .or() 方法使用 optional2 作为替代。

2. Optional.orElse(T other)

  • 作用: 如果当前 Optional 为空,则返回一个预定义的默认值 other;如果 Optional 有值,则返回该值。
  • 返回类型: 返回 T 类型的对象。
  • 使用场景: 当你有一个明确的默认值,并且你希望在Optional为空时返回这个默认值时使用。
  • 执行时机: 总是执行,即使 Optional 中有值,other 也会被创建和传递。

示例

Optional<String> optional = Optional.empty();

String result = optional.orElse("Default Value");

System.out.println(result); // 输出: Default Value

在这个示例中,optional 是空的,所以返回默认值 “Default Value”。

3. Optional.orElseGet(Supplier<? extends T> supplier)

  • 作用: 如果当前 Optional 为空,则返回一个由 supplier 提供的值;如果 Optional 有值,则返回该值。
  • 返回类型: 返回 T 类型的对象。
  • 使用场景: 当你需要动态生成一个默认值,并且这个生成过程可能比较昂贵或者复杂时使用。
  • 执行时机: 只有当Optional为空时,才会调用 supplier(即惰性求值)。

示例

Optional<String> optional = Optional.empty();

String result = optional.orElseGet(() -> "Generated Value");

System.out.println(result); // 输出: Generated Value

在这个示例中,optional 是空的,所以使用 supplier 生成并返回值 “Generated Value”。

总结对比

方法返回值来源是否惰性求值使用场景
or(Supplier)返回 supplier 提供的 Optional 对象链接多个 Optional,直到找到一个非空的 Optional
orElse(T)返回传入的默认值有一个明确的默认值,无论 Optional 是否为空
orElseGet(Supplier)返回 supplier 提供的值动态生成默认值,且只有在需要时才生成

当你知道有一个明确的默认值时,使用 .orElse()。当默认值生成可能昂贵或依赖于一些逻辑时,使用 .orElseGet()。当你想链接多个 Optional,并使用下一个 Optional 作为备用时,使用 .or()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值