用于理解scala中对flatMap的未来转换



我一直在看这个Scala期货是如何与flatMap链接在一起的?并对相应的文章进行了翻译理解。我正在慢慢地添加东西给我的理解,我卡住了,因为我猜我认为会翻译的代码是不正确的。

这里我有一个runProgram和runProgram2,我认为它们是等价的,但不是,因为runProgram2不编译。谁能解释一下这个等价的东西?

注:是的,我知道未来。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
}

这个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,问题是这里你的SFuture[String],它被包装在另一个未来中,而不是Future[Future[String]], flatMap:

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

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

最新更新