orElse立即返回默认值,无论Optional是否有值;而orElseGet仅在Optional为空时才通过Supplier惰性计算默认值,避免不必要的资源开销。

orElse 是 Java 8 引入的 Optional 类中的一个方法,专门用于在 Optional 包装的值为 null(即空)时,返回你指定的默认值。
orElse 的基本用法
它接收一个参数:当 Optional 为空(isPresent() == false)时,直接返回该参数;否则返回 Optional 中实际封装的值。
- 语法简洁:`optional.orElse(defaultValue)`
- 参数类型必须与
Optional的泛型类型一致,比如Optional<String>就只能传String - 注意:传入的默认值是**立即求值**的——无论 Optional 是否为空,这个值都会被创建或计算一次
和 orElseGet 的关键区别
如果你的默认值构造开销大(比如要查数据库、新建对象、调用耗时方法),用 orElse 可能浪费资源。这时应改用 orElseGet(Supplier):
- `orElse("default")` → 字符串字面量,没问题
- `orElse(new HeavyObject())` → 每次都 new,即使 Optional 不为空也执行
- `orElseGet(() -> new HeavyObject())` → 只有为空时才执行 lambda,更高效
常见使用场景示例
比如从 Map 获取用户姓名,可能不存在:
立即学习“Java免费学习笔记(深入)”;
String name = Optional.ofNullable(userMap.get(userId))
.orElse("未知用户");
再比如解析配置项,缺失时给个安全默认值:
int timeout = Optional.ofNullable(config.getProperty("timeout"))
.map(Integer::parseInt)
.orElse(3000); // 默认 3 秒
注意事项
- 不能传
null给orElse,否则会抛NullPointerException - 如果需要“空值转 null”逻辑,不要用
orElse(null),而应考虑是否真需要 null,或改用orElseGet(() -> null)(但通常不推荐) - 链式调用中,
orElse通常是最后一步,适合做兜底,不适合做条件分支逻辑


















