首页  >  文章  >  Java  >  如何在 Java 中将可选值扁平化为流

如何在 Java 中将可选值扁平化为流

Barbara Streisand
Barbara Streisand原创
2024-10-24 04:16:30244浏览

How to Flatten Optionals into a Stream in Java

Java 8 Stream::flatMap 的可选用法

Stream::flatMap 是 Java 8 中的一个强大工具,用于将多个流合并为一个流。但是,它需要返回一个流,这在处理可选值时可能会出现问题。

问题

考虑我们有一个 List 的情况。以及将每个事物映射到可选<其他>的方法。我们想要将事物映射到Optional,然后检索第一个非空Optional。

使用Stream::flatMap和Optional::findFirst的简单方法会失败,因为Optional不提供stream()方法:

<code class="java">things.stream().flatMap(this::resolve).findFirst(); // Error!</code>

解决方案

Java 16及更高版本

Java 16引入了Stream.mapMulti,它允许将Optional映射到一个流其非空元素:

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .<Other>mapMulti(Optional::ifPresent)
          .findFirst();</code>

Java 9

Java 9 添加了Optional.stream,直接返回非空Optional 值的流:

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(Optional::stream)
          .findFirst();</code>

Java 8

对于 Java 8,我们可以使用辅助函数将Optional 转换为流:

<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) {
    if (opt.isPresent())
        return Stream.of(opt.get());
    else
        return Stream.empty();
}</code>

使用这个辅助函数,解决方案变成:

<code class="java">Optional<Other> result =
    things.stream()
          .flatMap(t -> streamopt(resolve(t)))
          .findFirst();</code>

以上是如何在 Java 中将可选值扁平化为流的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn