当前位置: 首页 > 知识库问答 >
问题:

使用Java8的可选Stream::FlatMap

娄振
2023-03-14

考虑一个列表 things 和方法可选的 resolve(thingthing) 。我想将things映射到optional s并获得第一个other。显而易见的解决方案是使用Things.stream().FlatMap(This::Resolve).FindFirst(),但FlatMap要求返回一个流,而Optional没有stream()方法(或者它是集合或提供一个方法将其转换为集合,或将其作为集合)查看。

我能想出的最好的办法是:

things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();

但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

共有1个答案

郎言
2023-03-14

optional.stream已添加到JDK9中。这使您能够执行以下操作,而不需要任何helper方法:

Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(Optional::stream)
          .findFirst();

是的,这是API中的一个小漏洞,因为将可选 转换为零或一个长度的有点不方便。您可以这样做:

Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
          .findFirst();

不过,在flatmap中使用三元运算符有点麻烦,因此编写一个小的helper函数可能更好:

/**
 * Turns an Optional<T> into a Stream<T> of length zero or one depending upon
 * whether a value is present.
 */
static <T> Stream<T> streamopt(Optional<T> opt) {
    if (opt.isPresent())
        return Stream.of(opt.get());
    else
        return Stream.empty();
}

Optional<Other> result =
    things.stream()
          .flatMap(t -> streamopt(resolve(t)))
          .findFirst();
 类似资料:
  • 本文向大家介绍java8中Stream的使用示例教程,包括了java8中Stream的使用示例教程的使用技巧和注意事项,需要的朋友参考一下 前言 Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作。 本文将给大家详细介绍关于java8 Stream使用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1. 原理 S

  • 概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。 特点 不是数据结构,不会保存数据。 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行

  • 在我的一些项目中,我经常使用do-thin-check NextForNull-getNext循环模式(不知道它是否有官方名称)。但是在Java8中,与检查客户端代码中的空引用相比,使用可选被认为是更干净的代码。但是当在这种循环模式中使用可选时,代码会变得有点冗长和丑陋,但是因为可选有一些方便的方法,我希望一定存在比我下面提出的更干净的方法。 示例: 考虑到下面的课程。 其中第一个项目的nr==1

  • 本文向大家介绍java8使用Stream API方法总结,包括了java8使用Stream API方法总结的使用技巧和注意事项,需要的朋友参考一下 Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。 Stream 的三个操作步骤 1、创建S

  • 编译错误->[无法推断flatMap(函数>)的类型参数]