[英]for comprehension with futures in scala translation to flatMap
我一直在研究Scala期貨如何與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
}
這是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]]
包裝了Future[Future[String]]
和flatMap
:
def flatMap[S](f: T => Future[S])(implicit executor: ExecutionContext): Future[S]
從T
到Future[S]
一個函數並返回該future,在您的情況下,您的方法已經返回了future,並且這是flatMap
的有效參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.