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

Scala 未来类型不匹配问题

涂玉韵
2023-03-14

我遇到了一个关于Scala和多种未来收益的问题。f1和f2都是期货。f2期货基于从f1期货获得的值。

val result = for {
    f1 <- Await.result(dao.findNode("nodeA"), 5 seconds)            // This returns back a MyNode class
    f2 <- if (f1 != None && f1.isUpAndRunning)
                Future { LookupResult(true, f1.varA, f1.varB) }
          else
                lk ? Lookup(sm.id, sm.("address"))
} yield(f1, f2)

根据 f1 的结果,我要么在 if 语句计算结果为 false 时执行 Lookup(),要么返回 LookupResult),要么模仿默认的 LookupResult。

返回以下错误:

类型不匹配。必需:选项[B_],找到:Future[(MyNode,Any)]

我只是没有正确映射结果吗?例如,我应该在某个地方使用asInstanceOf,因为无论我做什么,我都无法对其进行编译。

非常感谢各位。

共有1个答案

董新觉
2023-03-14

您的 dao.findNode 方法很有可能导致 Future[Option[MyNode]],因此 Await.result 使 f1 成为 Option[MyNode]。目前还不清楚你想要什么类型,但你可以用这个得到一个未来[(选项[MyNode],LookupResult)]

dao.findNode("nodeA"), 5.seconds)
  .flatMap { nodeOpt: Option[MyNode] =>
    nodeOpt.filter(_.isUpAndRunning)
      .map { node =>
        // node exists and is up and running
        val finalResult = nodeOpt -> LookupResult(true, node.varA, node.varB)

        // it's much more efficient in this scenario to use
        // Future.successful than Future { }
        Future.successful(finalResult)
      }
      .getOrElse {
        // node didn't exist, or wasn't up and running
        val lookupFut = lk ? Lookup(sm.id, sm.("address"))
        lookupFut.map { lookupResult =>
          nodeOpt -> lookupResult
        }
      }
  }

大致的情况是:

  • 使用ao查找节点
  • 当我们获得(可能不存在的)节点以检查它是否启动并运行时(在这种情况下,我们会短路到我们现在已知的最终结果),否则执行查找并在查找成功时构建最终结果

使用< code>Future.successful是因为< code>Future {}在线程上调度任务和完成Future几乎肯定会比构造最终结果产生更多的开销。

 类似资料:
  • 我对Scala很陌生,请耐心等待。我有一堆包裹在一个大数组中的期货。期货已经完成了他们的辛勤工作,查看了一些TB的数据,在我的应用程序结束时,我想总结所有的结果,这样我就可以很好地展示它们。 我拥有的期货集合属于以下类型: 到目前为止,我读到的所有关于理解的东西都表明 导致 按照同样的逻辑,我的意图是这样做,因为我最近发现选项,尝试,失败和成功可以被视为集合: 但这不一定行得通。我似乎收到了以下编

  • 我有一个从提取的代码,对于多个子类来说,这个代码看起来应该完全相同,所以我尽量避免重复。但是,实际上(见下文),scala认为是一个泛型的,返回的值类型为,当然,它没有和方法。 问题是在这里避免重复的适当方法是什么?我对将转换为字符串并不那么着迷,因为这段代码可以使用刚从字符串解析为AST的json。我开始考虑为我需要的三种类型编写包装器,并将这些类型的匹配和隐式转换器转换为包装器,然后为这些包装

  • 我已经在scala shell中单独测试了我的错误代码 我想使用a.\u 1作为键,这样我可以进一步使用join操作符,并且需要(键,值)对。但我的问题是,为什么在使用reduce函数时会有一个required类型?我认为这种形式是由我们自己设定的,而不是有规定的。我错了吗? 此外,如果我错了,那么为什么需要它(String,String,Int)?为什么不是别的? ps:我知道是中的值类型,这是

  • 我在这里复制代码;https://developer.android.com/codelabs/kotlin-android-training-view-model#5 但我从DataBindingUtil中得到了一个类型不匹配。充气方法。正在返回ViewDataBinding!,当需要FragmentPlayBinding时。 我https://github.com/google-develop

  • 问题内容: 编写内部API时遇到以下错误。我正在尝试以以下方式读取值(SQL Server 2012): 现在,虽然看起来有些奇怪,但我以这种方式阅读的原因是因为它是我编写的包装程序的一部分,我们使用它来加快sql的读写速度。它接受一个匿名对象,并根据属性名称或属性名称将所有sql值读入其中。 这适用于除以外的所有内容。我进行了类型比较,它也同样失败,因此很hacky,我什至无法检查该列是否为类型