在 Java 中,Optional 和 Stream 常常结合使用,主要场景是:避免 NullPointerException、在流中安全地处理可能为空的值、扁平化结果。
下面按常见用法给你梳理一下。
Optional.stream()(Java 9+)把 Optional 变成长度 0 或 1 的 Stream。
Optional<String> opt = Optional.of("hello");
opt.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
如果 Optional.empty():
Optional<String> opt = Optional.empty();
opt.stream().forEach(System.out::println); // 什么都不做
✅ 适合在 flatMap 中使用
flatMapList<Optional<String>> list = List.of(
Optional.of("a"),
Optional.empty(),
Optional.of("b")
);
list.stream()
.flatMap(Optional::stream)
.map(String::toUpperCase)
.forEach(System.out::println);
输出:
A
B
✅ 自动过滤掉 Optional.empty()
class User {
private Optional<String> email;
public Optional<String> getEmail() {
return email;
}
}
List<User> users = ...;
users.stream()
.flatMap(u -> u.getEmail().stream())
.forEach(System.out::println);
Optional<Optional<T>>❌ 错误写法:
list.stream()
.map(this::findById) // Stream<Optional<User>>
✅ 正确写法:
list.stream()
.map(this::findById)
.flatMap(Optional::stream)
.forEach(System.out::println);
list.stream()
.map(this::findOptional)
.flatMap(Optional::stream)
.collect(Collectors.toList());
filter 搭配Optional<User> user = ...;
user.stream()
.filter(u -> u.getAge() > 18)
.findFirst();
Optional.stream() 怎么办?用三元或判空:
optional.isPresent()
? Stream.of(optional.get())
: Stream.empty();
或更优雅:
optional.map(Stream::of).orElseGet(Stream::empty);
| 场景 | 推荐方式 |
|---|---|
| Optional → Stream | optional.stream() |
| Stream<Optional |
flatMap(Optional::stream) |
| 避免嵌套 Optional | flatMap |
| 过滤 empty | flatMap 自动过滤 |
如果你有具体业务代码(比如 DAO、DTO、集合嵌套),我可以直接帮你改成 Optional + Stream 的最佳写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。