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中文網其他相關文章!