【问题标题】:for comprehension with futures in scala translation to flatMap理解 scala 转换为 flatMap 的期货
【发布时间】:2014-10-14 06:00:44
【问题描述】:

我一直在看这个How are Scala Futures chained together with flatMap? 和相应的文章以及翻译理解。我正在慢慢地向我的理解中添加一些东西,并且因为我猜我认为会翻译成的代码不正确而被卡住了。

在这里,我有一个 runProgram 和 runProgram2,我认为它们是等效的,而不是因为 runProgram2 无法编译。有人可以解释一下这个等价的理解吗...

注意:是的,我知道 future.flatMap 通常用于折叠 Future[Future[String]] 但这是我文件的精简版本(也许我修剪得太远了)。

def main(args: Array[String]) = {
  val future1: Future[String] = runMyProgram()

  //val future2: Future[String] = runMyProgram2()

}

def runMyProgram() : Future[String] = {
  val future = serviceCall()
  future.flatMap(processAllReturnCodes)
}

//    def runMyProgram2() : Future[String] = {
//      val future = serviceCall()
//      for {
//        result <-  future
//      } yield processAllReturnCodes(result)
//    }

def processAllReturnCodes(count: Int) : Future[String] = {

  val promise = Promise.successful("done")
  promise.future
}

def serviceCall() : Future[Int] = {
  val promise = Promise.successful(5)
  promise.future
}

def serviceCall2() : Future[String] = {
  val promise = Promise.successful("hithere")
  promise.future
}

【问题讨论】:

    标签: scala scala-2.9


    【解决方案1】:

    这个for理解:

    for {
      result <-  future
    } yield processAllReturnCodes(result)
    

    正在翻译成这样:

    val t: Future[Future[String]] = future.map(result => processAllReturnCodes(result))
    

    理解实际上只是 mapflatMap 的语法糖,使用 flatMap 您可以展平未来的嵌套:

    val u: Future[String] = future.flatMap(result => processAllReturnCodes(result))
    

    区别在于签名:

    def map[S](f: T => S)(implicit executor: ExecutionContext): Future[S]
    

    所以map 采用函数形式TS 并在未来包装S,问题是这里你的S 是一个Future[String],它被包装在另一个未来给@ 987654335@, flatMap 代替:

     def flatMap[S](f: T => Future[S])(implicit executor: ExecutionContext): Future[S]
    

    TFuture[S] 获取一个函数并返回该未来,在您的情况下,您的方法已经返回一个未来并且它是flatMap 的有效参数。

    【讨论】:

      猜你喜欢
      • 2015-07-22
      • 2017-03-26
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多