在 Java 中,Optional 本身就是为**链式调用(fluent API)**设计的,核心是通过一系列返回 Optional 的方法连续操作,避免显式 null 判断。
下面从基础 → 常用链式方法 → 实战示例逐步说明。
| 方法 | 作用 | 是否返回 Optional |
|---|---|---|
of / ofNullable |
创建 Optional | ✅ |
map |
转换值(可能为 null) | ✅ |
flatMap |
转换并返回 Optional | ✅ |
filter |
条件过滤 | ✅ |
orElse / orElseGet |
取默认值 | ❌ |
ifPresent |
有值才执行 | ❌ |
stream(Java 9+) |
转 Stream | ✅ |
String result = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.filter(city -> city.startsWith("北"))
.orElse("未知城市");
✅ 如果任意一层为 null,直接返回 "未知城市"
Optional<String> opt = Optional.of(user)
.map(User::getName);
Optional<String> opt = Optional.of(user)
.flatMap(User::getOptionalName);
public Optional<String> getOptionalName() {
return Optional.ofNullable(name);
}
⚠️ 错误示例(编译错误)
.map(User::getOptionalName) // 变成 Optional<Optional<String>>
❌ 传统写法:
if (user != null) {
if (user.getAddress() != null) {
return user.getAddress().getCity();
}
}
✅ Optional 写法:
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知");
Optional.ofNullable(user)
.ifPresentOrElse(
u -> System.out.println(u.getName()),
() -> System.out.println("用户不存在")
);
List<String> cities = Optional.ofNullable(user)
.stream()
.map(User::getAddress)
.map(Address::getCity)
.toList();
public String getCitySafe(User user) {
return Optional.ofNullable(user)
.filter(u -> u.getAge() > 18)
.flatMap(User::getAddressOpt)
.map(Address::getCity)
.filter(c -> !c.isBlank())
.orElse("未知城市");
}
✅ 适合:
❌ 不适合:
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。