在 Java 中,Optional 是专门用来显式表达“可能为空的值”,从而帮助避免 NullPointerException 的容器类(Java 8 引入)。下面从常见错误用法、正确用法和最佳实践几个方面说明。
不要用
null表示“没有值”,用Optional.empty()表示“没有值”
Optional<String> name = Optional.ofNullable(getName());
这样调用方被迫处理“可能为空”的情况,而不是默认它一定有值。
get()(最容易踩坑)❌ 错误用法:
Optional<String> opt = ...
String value = opt.get(); // 可能抛 NoSuchElementException
✅ 正确方式:
orElse(有默认值)String value = opt.orElse("default");
orElseGet(延迟计算)String value = opt.orElseGet(() -> generateDefault());
orElseThrow(明确异常)String value = opt.orElseThrow(() -> new RuntimeException("value is null"));
ifPresent 避免显式判空❌ 传统写法:
if (user != null) {
System.out.println(user.getName());
}
✅ Optional 写法:
Optional<User> userOpt = ...
userOpt.ifPresent(u -> System.out.println(u.getName()));
map 安全取值(链式调用)❌ 容易 NPE:
String city = user.getAddress().getCity();
✅ 安全写法:
Optional<User> userOpt = ...
String city = userOpt
.map(User::getAddress)
.map(Address::getCity)
.orElse("Unknown");
✅ 即使中间任何一层为 null,也不会抛异常。
flatMap 处理返回 Optional 的方法Optional<Order> orderOpt = ...
Optional<String> productNameOpt = orderOpt
.flatMap(Order::getProductOpt);
map用于普通返回值
flatMap用于返回Optional的方法
filter 做条件判断Optional<User> adminOpt = userOpt
.filter(u -> u.getRole().equals("ADMIN"));
如果条件不满足,变成 Optional.empty()
class User {
Optional<String> name; // 不推荐
}
原因:
✅ 正确做法:
class User {
String name; // 允许 null
}
void print(Optional<String> text) // 不推荐
✅ 推荐:
void print(String text) {
Optional.ofNullable(text).ifPresent(System.out::println);
}
Optional.of("hello").get(); // 毫无意义
public Optional<User> findUserById(Long id) {
return Optional.ofNullable(userRepository.findById(id));
}
userService.findUserById(1L)
.ifPresent(user -> log.info(user.getName()));
Optional 不是用来“消灭 null”,而是用来“强迫你处理 null”
get()orElse / ifPresent / map如果你愿意,我也可以结合 真实业务代码 或 Spring / MyBatis 场景 给你具体示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。