温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Optional 在 Stream 里怎么用

发布时间:2026-08-31 20:05:50 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

在 Java 里,Optional 和 Stream 经常一起用,主要目的是避免 null、优雅地处理可能缺失的值。下面从常见用法讲起。


一、Optional 本身不是 Stream,但可以和 Stream 配合

Optional<T> 代表“可能有值,也可能没有”。

1️⃣ 从 Optional 生成 Stream(Java 9+)

Optional<String> opt = Optional.of("hello");

Stream<String> stream = opt.stream();

stream.forEach(System.out::println);
  • 如果有值 → 生成一个包含该值的 Stream
  • 如果为空 → 生成一个空 Stream

✅ 常用于:把 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

二、Stream 返回 Optional 的常见场景

2️⃣ findFirst() / findAny()

List<Integer> nums = List.of(1, 2, 3);

Optional<Integer> first = nums.stream()
    .filter(n -> n > 1)
    .findFirst();
  • 找到 → Optional[2]
  • 没找到 → Optional.empty()

3️⃣ reduce()

Optional<Integer> sum = Stream.of(1, 2, 3)
    .reduce(Integer::sum);

三、在 Stream 中避免 null(推荐做法)

❌ 不推荐:

stream.map(x -> x.getFoo()) // 可能 NPE

✅ 推荐:

stream
    .map(Obj::getFoo)
    .filter(Objects::nonNull)

或者返回 Optional:

stream
    .map(Obj::getFooOptional)
    .flatMap(Optional::stream)

四、Optional + Stream 的实用技巧

4️⃣ 有值才继续 Stream

Optional<String> opt = Optional.of("data");

opt.stream()
   .map(String::toUpperCase)
   .forEach(System.out::println);

5️⃣ 如果为空给默认值

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 等),我可以直接给你示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手