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()。