orelse在optional为空时返回指定默认值,且参数立即求值;若optional有值则返回其值;需确保默认值非null,否则应改用orelseget避免无效兜底。

orElse 是 Optional 中最常用的方法之一,用于在 Optional 包装的对象为 null(即空值)时,返回你指定的默认值。
orElse 的基本用法
它接收一个参数:当 Optional 为空时要返回的默认对象。无论这个默认值是字面量、常量、新创建的对象,还是方法调用结果,只要不是 null(除非你明确允许),它都会被直接返回。
- 如果
Optional有值(isPresent() == true),就返回该值; - 如果
Optional为空(isPresent() == false),就返回你传入orElse的参数。
常见写法示例
假设你从 Map 中根据 key 查找一个 User 对象:
User user = Optional.ofNullable(userMap.get("uid123"))
.orElse(new User("anonymous", "unknown@example.com"));
如果 map 中没有 "uid123" 对应的用户,就会新建一个默认用户返回。
也可以用常量或简单字面量:
String name = Optional.ofNullable(userInfo.getName())
.orElse("未命名");
注意 orElse 和 orElseGet 的区别
orElse 的参数是**立即求值**的——不管 Optional 是否为空,它都会先执行你传进去的表达式。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
比如:
String s = Optional.empty().orElse(createDefaultString());
即使 Optional 是空的,createDefaultString() 也会被执行一次。
如果你希望只在真正需要时才创建默认值(比如创建开销大、有副作用),应该用 orElseGet(Supplier):
String s = Optional.empty().orElseGet(() -> createDefaultString());
这时,只有 Optional 为空才会调用 supplier。
不推荐的用法
避免把可能为 null 的对象直接传给 orElse:
// ❌ 危险!如果 defaultUser 是 null,结果仍是 null User user = Optional.ofNullable(actualUser).orElse(defaultUser);
这样一旦 defaultUser 本身为 null,整个表达式就失去兜底意义。应确保默认值非 null,或改用 orElseGet + 显式构造逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










