1. 概述
在本文中,我们将讨论如何从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中的一个选项是使用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的到来,将stream()方法添加到Optional中,所有这些都将变得非常简单。
这种方法类似于第3节中显示的方法,但这次我们使用预定义的方法将Optional实例转换为Stream实例:
无论Optional值是否存在,它都将返回一个或零个元素的流:
List<String> filteredList = listOfOptionals.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
5. 总结
因此,我们看到了三种从Optional Stream中过滤当前值的方法。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章