本文主要是介绍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()
。
这篇关于java.util.Optional.or() .orElse(), .orElseGet()的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!