在 Java 8 引入的 Optional<T> 不是为了替代 null,也不是用来避免所有判空的工具,而是一种表达“值可能不存在”这一语义的手段。下面按适合场景 / 不适合场景 / 常见用法来说明。
明确表示“可能没有结果”
public Optional<User> findUserById(Long id) {
return userRepository.findById(id);
}
调用方:
Optional<User> userOpt = findUserById(1L);
userOpt.ifPresent(u -> System.out.println(u.getName()));
✅ 优点:
null 更安全、可读性更好❌ 不适合返回 null 的接口改 Optional(老代码谨慎)
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("Unknown");
✅ 适合:
optional.ifPresent(this::sendNotification);
比:
if (obj != null) {
sendNotification(obj);
}
更函数式、更清晰
int port = Optional.ofNullable(config.getPort())
.orElse(8080);
或延迟计算:
int port = Optional.ofNullable(config.getPort())
.orElseGet(() -> loadDefaultPort());
list.stream()
.filter(u -> u.getAge() > 18)
.findFirst(); // 返回 Optional<User>
Stream API 本身大量使用 Optional
class User {
private Optional<String> email; // 不推荐
}
原因:
✅ 正确做法:
private String email; // null 表示没有
void process(Optional<User> user) // 不推荐
原因:
✅ 更好方式:
void process(User user) {
if (user == null) { ... }
}
if (opt.isPresent()) {
T t = opt.get(); // 错误用法
}
这是反模式,等价于:
if (t != null) { ... }
| 方法 | 用途 |
|---|---|
of() |
非空值,否则抛异常 |
ofNullable() |
允许 null |
empty() |
空 Optional |
isPresent() |
是否有值(少用) |
ifPresent() |
有值才执行 |
map() |
转换值 |
flatMap() |
返回 Optional |
orElse() |
默认值 |
orElseGet() |
延迟默认值 |
orElseThrow() |
无值抛异常 |
Optional 最适合:方法返回值、流式处理、明确“可能无值”的语义
最不适合:字段、参数、替代所有 null
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。