首頁 >Java >java教程 >如何在 Java 中將可選值扁平化為流

如何在 Java 中將可選值扁平化為流

Barbara Streisand
Barbara Streisand原創
2024-10-24 04:16:30325瀏覽

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