過濾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項目上找到代碼示例的完整實現。