通过将scala转换为flatMap的未来来理解

时间:2014-08-20 18:43:26

标签: scala scala-2.9

我一直在看这篇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
}

1 个答案:

答案 0 :(得分:2)

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]

所以mapT的函数形式转换为S,并在将来包装S,问题是这里S是{ {1}}包含在另一个未来,Future[String]Future[Future[String]]代替:

flatMap

def flatMap[S](f: T => Future[S])(implicit executor: ExecutionContext): Future[S] T执行一项功能并返回该未来,在您的情况下,您的方法已经返回了一个未来,并且它是Future[S]的有效参数。