概述
本文将讨论如何从Optional
流中过滤出非空值。我们将探讨三种不同的方法,其中两种使用Java 8,另一种使用Java 9的新特性。
我们将在所有示例中使用相同的列表:
List<Optional<String>> listOfOptionals = Arrays.asList(
Optional.empty(), Optional.of("foo"), Optional.empty(), Optional.of("bar"));
2. 使用filter()
Java 8的一个选项是使用filter()
方法结合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的到来,Optional
类增加了stream()
方法,这将大大简化上述过程。这种方法类似于第3部分所示,但这次我们使用了一个预定义的方法将Optional
实例转换为Stream
实例:
无论Optional
值是否存在,它将返回一个包含零个或一个元素的流:
List<String> filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
5. 总结
至此,我们快速了解了从Optional
流中过滤出非空值的三种方法。完整的代码示例实现可以在GitHub项目中找到。