如何中止迭代Java Stream forEach
過濾Java中的可選流
Java 8並行流中的自定義線程池
合併Java流
map()和flatMap()之間的區別
Java流的字符串操作
如何使用索引迭代流
Java中將迭代器轉變爲流
如何在Java中獲取流的最後一個元素?
將字符串轉換為字符流
Java中的“流已被操作或關閉”異常
Java 8和無限流
如何向流中添加單個元素
Java 8中的原始類型流
在Java Stream API中有所不同
Java 9 Stream API的改進
Java Spliterator簡介
如何在Java 8流中使用if / else邏輯
Java 8謂詞鏈
具有Lambda表達式的Java流過濾器
用Java流求和
Java 8 Streams peek() API
與Map一起使用流
過濾Java中的可選流
1.簡介
在本文中,我們將討論如何從Optionals
Stream
中過濾出非空值。
我們將研究三種不同的方法-兩種使用Java 8,一種使用Java 9中的新支持。
我們將在所有示例中使用相同的列表:
List<Optional<String>> listOfOptionals = Arrays.asList(
Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2.使用filter()
Java 8中的選項之一是使用Optional::isPresent
過濾掉值,然後使用Optional::get
函數執行映射以提取值:
List<String> filteredList = listOfOptionals.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
3.使用flatMap()
另一種選擇是將flatMap
與lambda表達式一起使用,該表達式將一個空的Optional
轉換為一個空的Stream
實例,將非空的Optional
轉換為僅包含一個元素的Stream
實例:
List<String> filteredList = listOfOptionals.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
另外,您可以使用將Optional
轉換為Stream
的不同方法來應用相同的方法:
List<String> filteredList = listOfOptionals.stream()
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
4. Java 9的Optional :: stream
隨著Java 9的到來,所有這些都將變得相當簡單,Java 9向Optional
添加了stream()
方法。
這種方法類似於第3節中展示的方法,但是這次我們使用一種預定義的方法將Optional
實例轉換為Stream
實例:
無論是否存在Optional
值,它都將返回一個元素或零元素的流:
List<String> filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
5.結論
有了這個,我們很快就看到了從Optionals
Stream
中過濾當前值的三種方法。
可以在Github項目上找到代碼示例的完整實現。