可以的,Java 的 Optional 是支持链式调用的,而且这正是它设计的主要目的之一,用来避免嵌套的 null 判断(if (a != null && a.getB() != null ...))。
下面从常见链式用法和注意事项两方面说明。
map + flatMap(最常用)用于“有值时继续处理,无值时直接返回 empty”。
Optional<User> userOpt = getUser();
String city = userOpt
.map(User::getAddress) // Optional<Address>
.map(Address::getCity) // Optional<String>
.orElse("Unknown");
✅ 只要任意一层为 null 或 empty,后续都不会执行,直接返回默认值。
filter用于条件过滤:
Optional<User> adult = userOpt
.filter(u -> u.getAge() >= 18);
如果条件不满足,结果会变成 Optional.empty()。
flatMap(避免 Optional 嵌套)当你返回的是 Optional 时,用 flatMap:
Optional<String> email = userOpt
.flatMap(User::getEmailOpt);
如果不小心用了 map,会变成:
Optional<Optional<String>> // 不推荐
ifPresent / ifPresentOrElse(终结操作)用于消费值,不再返回 Optional:
userOpt
.ifPresent(u -> System.out.println(u.getName()));
Java 9+:
userOpt
.ifPresentOrElse(
u -> System.out.println(u),
() -> System.out.println("No user")
);
orElse / orElseGet / orElseThrow(终结)User u = userOpt.orElse(new User());
User u2 = userOpt.orElseGet(() -> createUser());
User u3 = userOpt.orElseThrow(() -> new RuntimeException("no user"));
// 不推荐
Optional.of(user).map(User::getName);
直接:
user.getName();
如果逻辑复杂、可读性差,不如用普通 if。
Optional 作为参数或字段(不推荐)✅ Optional 可以链式调用
✅ 常用方法:map / flatMap / filter / ifPresent / orElse*
✅ 目的是:优雅地处理 null,而不是消灭 if
如果你愿意,我也可以给你一个真实业务场景的 Optional 链式示例(比如订单 → 用户 → 地址 → 城市)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。