对于 Java 新手来说,Optional 是 JDK 8 引入的一个用来优雅处理“可能为 null”的容器类,核心目的是减少 NullPointerException(NPE),让代码更清晰、更安全。
下面我从 是什么 → 为什么用 → 怎么用 → 新手常见坑 四个方面讲,适合零基础理解。
Optional<T> 就是一个盒子:
Optional<String> opt = Optional.of("hello");
Optional<String> empty = Optional.empty();
你可以理解为:
“我不确定这个值存不存在,但我用 Optional 包起来,你用的时候先确认一下”
❌ 错误认知:
Optional 是为了代替 if (xxx != null)
✅ 正确理解:
Optional 是为了明确表达“这个值可能不存在”,并强制你处理“不存在”的情况
User user = getUser();
String name = user.getName(); // 如果 user 是 null,直接崩
Optional<User> userOpt = getUserOptional();
userOpt.ifPresent(u -> System.out.println(u.getName()));
// 1. 一定非空(如果是 null 会报错)
Optional<String> o1 = Optional.of("abc");
// 2. 可能为 null(推荐)
Optional<String> o2 = Optional.ofNullable(null);
// 3. 明确表示空
Optional<String> o3 = Optional.empty();
✅ 新手建议:99% 用 ofNullable
if (opt.isPresent()) {
System.out.println(opt.get());
}
但不推荐这样写,和 if (x != null) 没区别。
opt.ifPresent(value -> {
System.out.println(value);
});
✅ 没有值就不会执行
String value = opt.orElse("默认值");
或者(懒加载,性能更好):
String value = opt.orElseGet(() -> "默认值");
Optional<User> userOpt = getUser();
String city = userOpt
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");
✅ 再也不写一堆 if (xxx != null)
String value = opt.orElseThrow(() -> new RuntimeException("值不存在"));
适合业务上“必须有值”的场景
Optional.of("abc").get(); // 完全没必要
class User {
Optional<String> name; // ❌ 不推荐
}
✅ Optional 只适合方法返回值
Optional<Optional<String>> // ❌ 灾难
orElse:无论如何都会执行orElseGet:只有为空才执行它只是提醒你:这里可能为 null
ofNullable + ifPresentmap + orElseorElseThrow如果你愿意,我可以:
你现在是刚学 Java,还是在写项目时遇到 Optional 了?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。