遍历可选的整数列表 ifPresent

Posted

技术标签:

【中文标题】遍历可选的整数列表 ifPresent【英文标题】:Iterate over an optional list of integers ifPresent 【发布时间】:2017-09-08 22:12:48 【问题描述】:

我有一个可选的整数列表。我希望查看列表是否实际存在,然后将其转换为流。一种方法是

Optional<List<Integer>> listOfNumbers = ...
if (listOfNumbers.isPresent()) 
    listOfNumbers.get().stream();

但是,我不希望有那个 if 条件。我搜索并看到ifPresent() 做了同样的事情,但是当我做listOfNumbers.ifPresent(this::get)) 时,我收到以下错误:

非静态变量 this 不能从静态上下文中引用

你能帮我以有效的方式做到这一点吗?这对我来说仍然是新的,所以如果我的理解有任何不正确的地方,请告诉我。

【问题讨论】:

listOfNumbers.orElse(Collections.emptyList()).stream()... ? 【参考方案1】:

正如 cmets 中所指出的,获得Stream 的最简单方法是将Optional.orElse 方法与Collections.emptyList 一起使用:

Stream<Integer> stream = listOfNumbers.orElse(Collections.emptyList()).stream();

Optional.map 的其他可能解决方案:

Stream<Integer> stream = listOfNumbers.map(List::stream).orElse(Stream.empty());

【讨论】:

我最喜欢第二个版本。我认为这更重要,因为我们真的不需要一个空列表,只需要一个空流,【参考方案2】:

更新 Java 9:

从 jdk9 开始,Optional 有了一个新方法 stream(),它返回一个元素的流或一个空流。

因此,从 Optional&lt;List&lt;Integer&gt;&gt; 变为 Stream&lt;Integer&gt; 变为

Stream<Integer> streamOfNumbers = listOfNumbers.stream().flatMap(List::stream);

【讨论】:

以上是关于遍历可选的整数列表 ifPresent的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 视图和公开的过滤器 - 如何重置可选的下拉列表过滤器,或允许“全部”选择

如何制作溢出后进入下一行的列表视图,并且只有一个项目应该是可选的

可选的SSRS参数

TMainMenu 类[四] - 所有可选的快捷键列表

Swift:添加可选整数

ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是