在 Java 中,Optional 是 Java 8 引入的一个容器类,位于 java.util 包下,用来表示一个值可能存在,也可能不存在,主要用于避免 NullPointerException(空指针异常)。
在 Java 8 之前,经常会出现这样的代码:
String name = user.getAddress().getCity().getName();
如果 user、address 或 city 任意一个为 null,就会抛 NullPointerException。
Optional 的初衷是:
显式地表达“可能没有值”,强迫调用者处理空值情况
Optional<T> 本质是一个容器:
Optional<String> opt = Optional.of("hello");
Optional<String> empty = Optional.empty();
// 1. 一定非 null 的值
Optional<String> opt1 = Optional.of("abc");
// 2. 可能为 null 的值
Optional<String> opt2 = Optional.ofNullable(null); // 不会抛异常
// 3. 空 Optional
Optional<String> opt3 = Optional.empty();
⚠️ Optional.of(null) 会直接抛 NullPointerException
if (opt.isPresent()) {
System.out.println(opt.get());
}
opt.ifPresent(value -> System.out.println(value));
String s = opt.get(); // 如果没有值,会抛 NoSuchElementException
❌ 不推荐直接 get()
String s = opt.orElse("default");
String s2 = opt.orElseGet(() -> "default");
区别:
orElse:无论如何都会执行orElseGet:只有为空时才执行(性能更好)String s = opt.orElseThrow(() -> new RuntimeException("值不存在"));
Optional<User> userOpt = ...;
String city = userOpt
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");
✅ 有效避免多层 null 判断
opt.filter(s -> s.length() > 3)
.ifPresent(System.out::println);
✅ 适合:
❌ 不适合:
public String getCity(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
City city = address.getCity();
if (city != null) {
return city.getName();
}
}
}
return "未知";
}
public String getCity(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.map(City::getName)
.orElse("未知");
}
Optional 不是用来消灭 null,而是用来“明确表达和处理可能不存在的值”。
如果你愿意,我也可以讲:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。