在 Java 里,Optional 和 Stream 经常一起用,主要目的是避免 null、优雅地处理可能缺失的值。下面从常见用法讲起。
Optional<T> 代表“可能有值,也可能没有”。
Optional<String> opt = Optional.of("hello");
Stream<String> stream = opt.stream();
stream.forEach(System.out::println);
✅ 常用于:把 Optional 放进 Stream 链中
List<Optional<String>> list = List.of(
Optional.of("A"),
Optional.empty(),
Optional.of("B")
);
list.stream()
.flatMap(Optional::stream)
.forEach(System.out::println);
输出:
A
B
findFirst() / findAny()List<Integer> nums = List.of(1, 2, 3);
Optional<Integer> first = nums.stream()
.filter(n -> n > 1)
.findFirst();
Optional[2]Optional.empty()reduce()Optional<Integer> sum = Stream.of(1, 2, 3)
.reduce(Integer::sum);
❌ 不推荐:
stream.map(x -> x.getFoo()) // 可能 NPE
✅ 推荐:
stream
.map(Obj::getFoo)
.filter(Objects::nonNull)
或者返回 Optional:
stream
.map(Obj::getFooOptional)
.flatMap(Optional::stream)
Optional<String> opt = Optional.of("data");
opt.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
String value = opt.orElse("default");
或配合 Stream:
Stream<String> s = opt.stream().findAny()
.map(Stream::of)
.orElseGet(Stream::empty);
❌ 不要这样:
optional.get(); // 可能 NoSuchElementException
optional.isPresent();
optional.get();
✅ 更好:
optional.ifPresent(System.out::println);
optional.map(...).orElse(...);
Stream 负责“多个元素的处理”,Optional 负责“单个可能缺失的值”
用Optional.stream()和flatMap把它们自然地连起来。
如果你有具体代码场景(比如集合里嵌套 Optional、DTO 转 Entity 等),我可以直接给你示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。