Java 8 引入的 Optional 本意是显式表达“可能为空”,但用不好反而会埋坑。下面按常见误区 + 建议给你总结一下。
坑:
Optional<String> name = Optional.of("tom");
String n = name.get(); // 如果为空直接 NoSuchElementException
注意:
Optional 不是用来替代所有 null 的DTO / 实体字段 / 方法参数 用❌ 错误用法:
class User {
Optional<String> name; // 不推荐
}
void foo(Optional<String> opt) {} // 更不推荐
✅ 正确用法:
get()坑:
Optional<String> opt = ...
String s = opt.get(); // 可能炸
推荐替代:
opt.orElse("default");
opt.orElseGet(() -> computeDefault());
opt.orElseThrow(() -> new RuntimeException("缺失"));
Optional 不等于“安全”坑:
Optional.of(null); // 直接 NPE
规则:
Optional.ofOptional.ofNullableOptional.empty()坑:
Optional.ofNullable(user)
.ifPresent(u -> {
System.out.println(u.getName());
});
其实等价于:
if (user != null) {
System.out.println(user.getName());
}
注意:
map 和 flatMap 混用坑:
Optional<Optional<String>> o = opt.map(u -> Optional.of(u.getName()));
✅ 应该用:
opt.flatMap(u -> Optional.ofNullable(u.getName()));
orElse 里的代码一定会执行坑:
opt.orElse(createExpensiveObject()); // 不管有没有值都会执行
✅ 改成:
opt.orElseGet(() -> createExpensiveObject());
坑:
Optional 没有实现 Serializable✅ 解决:
isPresent()坑:
if (opt.isPresent()) {
doSomething(opt.get());
}
✅ 更优:
opt.ifPresent(this::doSomething);
list.stream()
.filter(x -> x != null)
.findFirst()
.ifPresent(...);
✅ Optional 是终端结果,不是流中间操作
Optional 是“返回值语义工具”,不是“null 替代品”
✅ 用在:
❌ 不用在:
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。