Stream::flatMap 是 Java 8 中的一个强大工具,用于将多个流合并为一个流。但是,它需要返回一个流,这在处理可选值时可能会出现问题。
考虑我们有一个 List
使用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中文网其他相关文章!