当前位置: 首页 > 面试题库 >

将Java 8的Optional与Stream :: flatMap一起使用

楚俊逸
2023-03-14
问题内容

新的Java 8流框架和新朋友创建了一些非常简洁的Java代码,但是我遇到了一个看似简单的情况,很难做到简洁。

考虑一个List<Thing> things和方法Optional<Other> resolve(Thing thing)。我想将Things映射到Optional s并获得第一个Other。显而易见的解决方案是使用 things.stream().flatMap(this::resolve).findFirst(),但是 flatMap要求你返回一个流,并且 Optional没有 stream()方法(或者它是 Collection或提供一种将其转换为或将其视为的方法 Collection)。

我能想到的最好的方法是:

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

但这对于一个很常见的案例来说似乎太漫长了。有人有更好的主意吗?


问题答案:

Java 9

Optional.stream 已添加到JDK9。这使你无需任何帮助程序方法即可执行以下操作:

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

Java 8

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

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

但是,在flatMap中使用三元运算符比较麻烦,因此最好编写一些辅助函数来完成此操作:

/**
 * 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();

在这里,我内联了对resolve()调用,而不是进行单独的map()操作,但这只是一个问题。



 类似资料:
  • 考虑一个和方法。我想将s映射到s并获得第一个。显而易见的解决方案是使用,但要求返回一个流,而没有方法(或者它是或提供一个方法将其转换为,或将其作为)查看。 我能想出的最好的办法是: 但这似乎是一个很普通的案例,但却显得太冗长了。谁有更好的主意?

  • 我想设置一个JAXB注释的Java类来生成以下格式的一些XML: “refId”字段是可选的,所以我想使用Guava的可选构造来引用内存中的字符串。我看到了使用Guava的Optional包装的泛型@XmlJavaTypeAdapter来解组,这提供了一个完整的示例,如果您使用的是元素(即使这不是最初的问题),那么您将如何设置XML属性的注释呢? 这是我到目前为止所拥有的: OptionalAda

  • 本文向大家介绍浅谈java8 stream flatMap流的扁平化操作,包括了浅谈java8 stream flatMap流的扁平化操作的使用技巧和注意事项,需要的朋友参考一下 概念: Steam 是Java8 提出的一个新概念,不是输入输出的 Stream 流,而是一种用函数式编程方式在集合类上进行复杂操作的工具。简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以将更多的控制权交给集

  • 我试图使用wsgen生成wsdl文件。如果我的webservice类扩展另一个类,我得到一个错误,但如果我删除扩展它的工作。这是错误消息: 另外,wsgen-完整版本: 请注意,我只有在使用Java8时才会出现这个问题。但是当我使用Java7和wsgen版本时,同样的代码可以工作: 下面是更多的细节以及如何复制它:我正在使用Java8,我有三个文件: basewebservice.java: 包w

  • 主要内容:1 Java8 Optional类的介绍,2 Java8 Optional类的方法,3 Java8 Optional类案例:不使用Optional类,4 Java8 Optional类案例1:如果不存在值,5 Java8 Optional类案例2:如果存在值,6 Java8 Optional类案例31 Java8 Optional类的介绍 Java在Jdk 8中引入了新的Optional类。它是一个公共的final类,用于处理Java应用程序中的NullPointerException

  • 我正在寻找一个简单可行的示例,该示例使用Spring Cloud Stream Kafka和Confluent Schema Registry(producer