在 Java 中,Optional 经常和 Stream 一起使用,主要用来避免空指针以及优雅地处理可能不存在的值。下面按常见场景给你总结一下。
List<String> list = Arrays.asList("a", "b", "c");
Optional<String> opt = list.stream()
.filter(s -> s.equals("b"))
.findFirst();
opt.ifPresent(System.out::println); // b
常用方法:
findFirst() → Optional<T>findAny() → Optional<T>min() / max() → Optional<T>flatMap + Optional(重点)当流中元素可能返回 Optional 时,用 flatMap:
List<String> list = Arrays.asList("1", "2", "x");
list.stream()
.map(s -> toInt(s)) // Stream<Optional<Integer>>
.flatMap(Optional::stream) // Stream<Integer>
.forEach(System.out::println);
static Optional<Integer> toInt(String s) {
try {
return Optional.of(Integer.parseInt(s));
} catch (NumberFormatException e) {
return Optional.empty();
}
}
✅ Optional.stream()(Java 9+)会把:
Optional.ofNullable(getUser())
.map(User::getName)
.ifPresent(System.out::println);
结合 Stream:
List<User> users = getUsers();
users.stream()
.map(u -> Optional.ofNullable(u.getName()))
.filter(Optional::isPresent)
.map(Optional::get)
.forEach(System.out::println);
更推荐写法(Java 9+):
users.stream()
.map(u -> Optional.ofNullable(u.getName()))
.flatMap(Optional::stream)
.forEach(System.out::println);
Optional<String> result =
list.stream()
.filter(s -> s.startsWith("a"))
.findFirst();
或者:
Optional<Integer> max =
list.stream()
.map(String::length)
.max(Integer::compare);
❌ 不要这样写:
list.stream()
.map(Optional::ofNullable)
.filter(o -> o.get() != null); // 容易 NPE
✅ 正确:
list.stream()
.map(Optional::ofNullable)
.flatMap(Optional::stream);
Stream 里用 Optional:
- 查找结果 → 直接返回
Optional- 可能为空的对象 →
Optional.ofNullable- 去掉空值 →
flatMap(Optional::stream)
如果你有具体使用场景(比如 DTO、数据库查询、嵌套对象),我可以直接给你最合适的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。