orelse()在optional为空时返回指定默认值,但参数总会被立即计算,不适合高开销或有副作用操作;默认值不可为null,否则抛npe。

Java 中 Optional.orElse() 方法用于在 Optional 为空(即 isPresent() == false)时,返回你指定的默认值。
orElse 返回非 null 默认值
它接收一个参数,作为“备选值”,只要 Optional 不为空,就返回其内部值;否则直接返回你传入的这个参数。注意:这个参数**总会被计算**,即使 Optional 有值也会执行——所以不适合放开销大或有副作用的操作。
-
不推荐:
optional.orElse(expensiveMethod())—— 即使 optional 有值,expensiveMethod()仍会被调用 -
推荐: 若需延迟计算,默认值用
orElseGet(Supplier)更安全
常见用法示例
比如从 Map 获取一个可能为 null 的值,包装成 Optional 后设置默认:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
String name = Optional.ofNullable(map.get("name"))
.orElse("未知用户");
如果 map.get("name") 是 null,就返回字符串 "未知用户";否则返回实际值。
和 orElseGet、orElseThrow 的区别
三者都处理空值场景,但行为不同:
-
orElse(T other):立即求值,适合简单字面量或无副作用对象 -
orElseGet(Supplier extends T> other):惰性求值,仅在需要时调用 Supplier,适合构造成本高或含逻辑的默认值 -
orElseThrow(Supplier extends Throwable> exceptionSupplier):为空时抛异常,常用于强制要求非空的业务场景
注意事项
传入的默认值不能是 null(否则会抛 NullPointerException),因为 orElse 的契约是返回一个非 null 的 T 类型实例。
- 错误写法:
optional.orElse(null)→ 运行时报 NPE - 正确写法:
optional.orElse("default")或optional.orElseGet(() -> createDefault())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










