0

我一直在看这个如何将 Scala Futures 与 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
}
4

1 回答 1

2

这个for理解:

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

被翻译成这样:

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

理解实际上只是 and 的语法糖mapflatMapflatMap可以展平未来的嵌套:

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]包装在另一个未来给予Future[Future[String]]中,flatMap而不是:

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

T从to获取一个函数Future[S]并返回该未来,在您的情况下,您的方法已经返回一个未来并且它是flatMap.

于 2014-08-20T18:49:51.307 回答