在 Java 中,Optional(java.util.Optional)是 Java 8 引入的一个容器类,用来更优雅、更安全地处理“可能为空的值”,主要目的是减少 NullPointerException。
以前写代码经常这样:
User user = getUser();
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String city = address.getCity();
}
}
问题:
null 判断NullPointerExceptionOptional 的作用就是:明确告诉调用者“这个值可能不存在”
Optional 不是用来替代 null 的“万能方案”,而是用来表达“可选值”的语义
典型语义:
Optional<String> opt1 = Optional.of("hello"); // 不能为 null
Optional<String> opt2 = Optional.ofNullable(null); // 可以为 null
Optional<String> opt3 = Optional.empty(); // 空 Optional
⚠️ Optional.of(null) 会直接抛异常
if (opt.isPresent()) {
System.out.println(opt.get());
}
✅ 更推荐 函数式写法
opt.ifPresent(value -> System.out.println(value));
String value = opt.orElse("default");
或(懒加载):
String value = opt.orElseGet(() -> "default");
String value = opt.orElseThrow(() -> new RuntimeException("不存在"));
Optional<User> userOpt = getUser();
String city = userOpt
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");
✅ 避免层层 null 判断
✅ 推荐场景
nullpublic Optional<User> findUserById(Long id) {
...
}
❌ 不推荐场景
// 不推荐
class User {
Optional<String> email;
}
❌ 把 Optional 当“ null 替代品”
❌ 到处用 get()(可能抛异常)
❌ 为了用而用,反而更复杂
Optional 不是消灭 null,而是让“可能为 null”这件事在代码层面变得可见、可控、可读。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。