登录
首页 >  文章 >  java教程

Java 9+ 中使用 Optional.or() 提供默认值的优雅方式

时间:2026-05-19 21:22:15 151浏览 收藏

Java 9 引入的 `Optional.or()` 提供了一种优雅、惰性且类型安全的方式来为可能为空的 `Optional` 补充默认的 `Optional` 实例——它不直接返回值,而是返回另一个 `Optional`,从而完美保持函数式链式调用的完整性;正确用法是传入一个返回 `Optional` 的 `Supplier`(如 `() -> Optional.of("default")`),而非原始值或已构建的 `Optional` 实例,这使其与 `orElse()` 和 `orElseGet()` 形成清晰分工:后者终结 Optional 上下文并返回具体值,而 `or()` 则延续 Optional 流程,支持后续 `map`、`filter` 等操作,大幅提升代码表达力与健壮性。

怎么通过 Optional.or() 在 Java 9 以后优雅地为当前为空的可选对象提供备选的包装实例

Java 9 的 Optional.or() 并不用于“提供备选的包装实例”,而是用于延迟生成并返回另一个 Optional —— 它的语义是“如果当前 Optional 为空,则执行 Supplier 获取一个新的 Optional;否则返回当前 Optional”。 想要“为 null 的 Optional 提供一个默认的非空 Optional 实例”,正确且优雅的方式是使用 Optional.or() 配合返回该实例的 Supplier,而不是直接传入实例。

理解 Optional.or() 的签名和行为

Optional or(Supplier> supplier)

  • 参数是 Supplier>,不是 TOptional
  • 不会解包或转换值,只做 Optional 层面的切换
  • supplier 是惰性求值的:仅当当前 Optional 为空时才调用
  • 返回值仍是 Optional,不是 T

如何用 or() 提供默认的 Optional 实例

若你有一个可能为空的 Optional opt,想在它为空时用 Optional.of("default") 替代,应这样写:

Optional<string> result = opt.or(() -> Optional.of("default"));</string>

✅ 正确:返回的是一个非空 Optional(要么是原 opt,要么是新创建的 Optional.of("default")

❌ 错误示例:
opt.or(Optional.of("default")) —— 编译不过,类型不匹配
opt.or(() -> "default") —— 编译不过,Supplier 必须返回 Optional

对比 or() 和 orElse()/orElseGet()

三者用途不同,别混用:

  • orElse(T other):返回 值本身T),适合你需要一个 T 的场景
  • orElseGet(Supplier):同上,但惰性求值,更高效
  • or(Supplier>):返回 另一个 Optional,适合你希望保持 Optional 上下文、继续链式调用(如 map/filter/flatMap)的场景

例如,你想在为空时提供默认值,再对其 trim 并转大写:

String upper = opt
    .or(() -> Optional.of("default"))
    .map(String::trim)
    .map(String::toUpperCase)
    .orElse("");

这里 or() 保留了 Optional 类型,让后续 map 可安全执行。

实用技巧:封装常用默认逻辑

可把高频默认模式抽成静态方法,提升可读性:

public static <T> Optional<T> orDefault(Optional<T> opt, T defaultValue) {
    return opt.or(() -> Optional.ofNullable(defaultValue));
}

// 使用
Optional<string> safe = orDefault(opt, "fallback");</string>

注意用 Optional.ofNullable() 而非 of(),以兼容 defaultValue 可能为 null 的情况(虽然通常不推荐默认值为 null)。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>