【问题标题】:Iterate over an optional list of integers ifPresent遍历可选的整数列表 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()... ?

标签: list lambda java-8 java-stream optional


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 2016-08-08
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多