orelse在optional为空时返回指定默认值,且默认值立即求值;orelseget则仅在为空时才通过supplier延迟执行,默认值构造开销大或有副作用时应优先使用。

orElse 方法用于在 Optional 为空(即 Optional.empty())时,返回你指定的默认值,是最常用、最直接的兜底方式。
orElse 返回固定默认值
它接收一个非 null 的参数,只要 Optional 里没有值,就原样返回这个参数。注意:无论 Optional 是否为空,这个默认值都会被立即计算(即“急求值”)。
- 适合默认值是常量、简单字面量或已计算好的对象,比如
"unknown"、0、new User("guest") - 不适合耗时或有副作用的操作,例如
orElse(expensiveMethod())—— 即使 Optional 有值,也会执行该方法 - 示例:
String name = optionalName.orElse("匿名用户");
orElseGet 延迟计算默认值(推荐替代)
当默认值构造成本高或可能抛异常时,用 orElseGet 更安全。它接收一个 Supplier,只在 Optional 为空时才调用。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 避免无谓计算,提升性能
- 可配合 lambda 或方法引用,例如:
optional.orElseGet(() -> fetchDefaultUser()) - 等价但更优写法:
optional.orElseGet(User::new)
orElseThrow 抛出异常作为兜底
当空值属于业务异常场景(如查不到用户应报错),可用 orElseThrow 明确中断流程。
- 不传参数时抛
NoSuchElementException - 可自定义异常:
optional.orElseThrow(() -> new UserNotFoundException("ID 不存在")) - 语义清晰,比手动判空 + throw 更简洁
别和 isPresent() + get() 混用
不要写成 if (opt.isPresent()) return opt.get(); else return default; —— 这违背 Optional 设计初衷,且重复调用 get() 可能引发 NPE(如果中间被修改)。
- orElse 系列方法内部已做空安全处理,一行代码替代多行判断
- 保持函数式风格,提升可读性和线程安全性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










