簡體   English   中英

將scala中的期貨理解為flatMap

[英]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))

理解實際上僅是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]]包裝了Future[Future[String]]flatMap

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

TFuture[S]一個函數並返回該future,在您的情況下,您的方法已經返回了future,並且這是flatMap的有效參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM