在 Java 8+ 中,Optional 的设计目的是显式表达“可能为空”的语义,而不是用来完全替代 null 检查或当作“万能空安全工具”。优雅使用 Optional 的核心原则是:不滥用、不嵌套、不绕弯。
下面从「常见误区 → 优雅用法 → 实战示例」三个层面讲。
void foo(Optional<String> name) {} // 不推荐
原因:调用方反而更麻烦,且 Optional 本身也可能为 null。
✅ 正确做法:
void foo(String name) {
// 方法内再决定是否用 Optional
}
Optional<Integer> getAge(); // 有时没必要
如果业务上一定存在,直接返回:
int getAge();
Optional<Optional<User>> // 灾难
public Optional<User> findUserById(Long id) {
return userRepository.findById(id);
}
调用方:
Optional<User> userOpt = findUserById(1L);
ifPresent 替代 null 判断❌ 传统写法:
User user = getUser();
if (user != null) {
System.out.println(user.getName());
}
✅ Optional 写法:
Optional.ofNullable(getUser())
.ifPresent(u -> System.out.println(u.getName()));
map 做安全转换String name = Optional.ofNullable(user)
.map(User::getName)
.orElse("未知");
避免:
if (user != null && user.getName() != null) ...
flatMap 处理嵌套对象Optional<String> city = Optional.ofNullable(user)
.flatMap(User::getAddressOpt)
.map(Address::getCity);
假设:
Optional<Address> getAddressOpt();
String name = userOpt.orElse("默认名");
⚠️ 区别:
orElse(getDefaultName()); // 无论如何都会执行
orElseGet(this::getDefaultName); // 只有为空才执行
✅ 有副作用或耗时操作用 orElseGet
User user = userOpt.orElseThrow(
() -> new RuntimeException("用户不存在")
);
比抛 NullPointerException 更清晰。
String city = Optional.ofNullable(getCurrentUser())
.flatMap(User::getAddressOpt)
.map(Address::getCity)
.orElse("未知");
一行搞定多层 null 判断。
✅ 适合:
❌ 不适合:
Optional 不是用来“防止 null”,而是用来“表达可能没有”。
如果你愿意,我也可以帮你把一段现有的 null 满天飞代码重构成 Optional 风格。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。