【发布时间】:2018-01-24 09:47:18
【问题描述】:
我正在寻找一种优雅的方式来使用 StreamEx 库仅流式传输非空 Optional 条目。或者标准库,如果可能的话。
目前我正在使用以下相当冗长的方法:
List<Optional<String>> list =
Arrays.asList(Optional.of("A"), Optional.empty(), Optional.of("B"));
List<String> nonEmpty =
StreamEx.of(list).filter(Optional::isPresent).map(Optional::get).toList();
我本质上是在寻找类似 StreamEx 的 nonNull 方法,但对于 Optional。
【问题讨论】:
-
Java 9:
List<String> nonEmpty = list.stream().flatMap(Optional::stream).toList(); -
您实际上应该将其添加为答案,而不是评论/编辑。我会赞成......而且SO也鼓励这样做。很好的发现!
-
如果您遇到这种情况,我相信您的设计有误。您不应该添加没有值的元素。所以我认为它是一个错误的设计,尽量避免以这种方式使用 optional。相反,对您的数据来源负责,您的数据来自何处,它们应该为您提供价值,而不是空的占位符。
-
@NikitaSalomatin 我想,这个列表只是一个例子。现实生活中的案例可能更多的是
streamOfOrdinaryValues .map(functionThatReturnsOptional) /*the issue of the question*/ .toList();... -
@NikitaSalomatin:这个例子是浓缩的。你说得有道理,但我认为这种情况经常会在现实世界中出现。
标签: java java-8 java-stream streamex