遍历可选的整数列表 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<List<Integer>>
变为 Stream<Integer>
变为
Stream<Integer> streamOfNumbers = listOfNumbers.stream().flatMap(List::stream);
【讨论】:
以上是关于遍历可选的整数列表 ifPresent的主要内容,如果未能解决你的问题,请参考以下文章
Drupal 视图和公开的过滤器 - 如何重置可选的下拉列表过滤器,或允许“全部”选择
如何制作溢出后进入下一行的列表视图,并且只有一个项目应该是可选的
ruby 实现Array#pad和Array#pad!。每个方法都接受最小大小(非负整数)和可选的pad值作为参数。如果是