我一直在看这个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))
理解对于map
和flatMap
来说只是语法糖,对于flatMap
,您可以平坦化未来的嵌套:
val u: Future[String] = future.flatMap(result => processAllReturnCodes(result))
区别在于签名:
def map[S](f: T => S)(implicit executor: ExecutionContext): Future[S]
所以map
采用T
到S
的函数,并在未来包装S
,问题是这里你的S
是Future[String]
,它被包装在另一个未来中,而不是Future[Future[String]]
, flatMap
:
def flatMap[S](f: T => Future[S])(implicit executor: ExecutionContext): Future[S]
从T
到Future[S]
获取一个函数并返回该未来,在您的情况下,您的方法已经返回一个未来,并且它是flatMap
的有效参数。