概述

本文将讨论如何从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项目中找到。


« 上一篇: Feign介绍