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

Optional.FlatMap()和Stream.FlatMap()[closed]之间有什么区别

糜俊彦
2023-03-14
    List<ObjectDTO> collect = types.stream()
            .flatMap(a -> client.getSthById(new URI(a)).stream())
            .collect(Collectors.toList());

对可选项使用flatMap时出现异常:

        List<ObjectDTO> collect2 = client.getSthByObj(obje.get(), null).getBrowse()
                .flatMap(uri -> client.getSthById(uri).stream())
                .collect(Collectors.toList());

为什么我不能用同样的方法呢?

共有1个答案

端木朝
2023-03-14

很难从您的代码片段中确定,因为我们不知道您使用的变量的类型,也不知道方法的返回类型。但我认为错误的来源是您试图传递一个lambda,该lambda返回streamoptional.flatMap()

让我们先看看streamstream.flatMap()接受一个返回的函数。这似乎正是您在第一个代码片段中给出的内容。

optional另一方面:optional.flatMap()需要一个返回optional的函数。如果getBrowse()返回一个optional,那么您传递给optional.flatmap的是URI->PhysicalInventoryClient.getSublocationsByIDS(uri).Stream()。这看起来像lambda返回一个流,而不是optional。当我在我的Eclipse中尝试相同的操作时,我得到一个编译错误,如下所示:

类型Optional 中的方法flatMap(函数<?super String,?extends optional<?extends u>>)不适用于参数((对象x)->{})

解决办法?Java9optional有一个stream方法,它可能让您实现您正在尝试的目标。同样,在不了解您的代码的情况下,很难提出建议,但可能是这样的:

    List<SublocationBrowseDTO> collect2 = physicalInventoryClient.getSublocationsByLocation(masterLocation.get(), null)
            .getBrowse()
            .stream()
            .flatMap(uri -> physicalInventoryClient.getSublocationsByIds(uri).stream())
            .collect(Collectors.toList());

编辑:不带流的备选项:

    List<SublocationBrowseDTO> collect2 = physicalInventoryClient.getSublocationsByLocation(masterLocation.get(), null)
            .getBrowse()
            .map(uri -> physicalInventoryClient.getSublocationsByIds(uri))
            .orElse(Collections.emptyList());
 类似资料:
  • 问题内容: 这两种方法有什么区别:和? 一个例子将不胜感激。 问题答案: 使用如果函数返回的对象,你需要或者如果该函数返回的。例如: 两个打印语句都打印相同的内容。

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 今天,我按照一些说明在Linux中安装软件。有一个脚本需要首先运行。它设置一些环境变量。 指令告诉我要执行,但是我执行错误了。因此未设置环境。最后,我注意到了这一点并继续进行。 我想知道这两种调用脚本方法的区别。我对Linux完全陌生,所以请尽可能详细。 问题答案: 运行脚本,将启动一个新的运行脚本的外壳。新的外壳程序不会影响启动脚本的父外壳程序。 是的简写形式,它将在当前shell中

  • 问题内容: 我刚开始使用Spring。我遇到了很多教程。我看到使用更多的例子比。我查看了Spring文档,但无法弄清楚使用其中一个的好处。有人可以提供一些解释吗? 问题答案: 是的便捷子类。 JavaDoc描述了一些添加的属性,这些属性在某些情况下可能有用: UrlBasedViewResolver的便利子类,它支持InternalResourceView(即Servlet和JSP)以及诸如Jst

  • 问题内容: 我刚刚看到了包含标签的CSS代码。我看着MDN看看是什么,但我真的不明白。 有人可以解释它是如何工作的吗? 它会在我们通过CSS选择之前创建DOM元素吗? 问题答案: 根据这些文档,它们是等效的: 唯一的区别是CSS3中使用了双冒号,而单冒号是旧版本。 推理: CSS 3中引入了:: before表示法,以便在伪类和伪元素之间建立区别。浏览器还接受:在CSS 2中引入的表示法。

  • 问题内容: 以下哪个更好? 要么 我知道的唯一区别是,当“ a”为null时,第一个返回false,而第二个抛出异常。除此之外,它们是否总是给出相同的结果? 问题答案: 使用时,你需要B在编译时知道类。使用时可以是动态的,并且可以在运行时更改。