【问题标题】:Remove empty Optionals from Stream using StreamEx使用 StreamEx 从 Stream 中删除空的 Optional
【发布时间】: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&lt;String&gt; 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


【解决方案1】:

这已经被添加了,但仅在 java-9 中:

list.stream()
    .flatMap(Optional::stream)
    .collect(Collectors.toList());

Stuart Marks here 有一个后端端口

【讨论】:

  • 是的,不幸的是我使用的是 Java 8。不过,确实有 StreamEx 可用,并希望它有一个类似于你所展示的快捷方式。
  • @Henrik 我会接受它,这没什么大不了的......直到你升级到 9
  • 但你可以比 Stuart Marks 做得更短:.flatMap(o -&gt; o.map(Stream::of).orElse(null))
  • @Holger 漂亮!我无法立即理解它,但是 如果映射的 Stream 为空,则使用空流
【解决方案2】:

对 StreamEx 问题积压的一些研究揭示了issue 49,它提供了一种较短的方法并包含对该主题的讨论:

List<String> nonEmpty = StreamEx.of(list).flatMap(StreamEx::of).toList();

更短,但是否更具可读性还有待讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多