Futures - map vs flatmap

前端 未结 4 1657
长发绾君心
长发绾君心 2020-12-23 09:59

I\'ve read the docs about map and flatMap and I understand that flatMap is used for an operation that accepts a Future pa

4条回答
  •  我在风中等你
    2020-12-23 10:49

    If you have a future, let's say, Future[HttpResponse], and you want to specify what to do with that result when it is ready, such as write the body to a file, you may do something like responseF.map(response => write(response.body). However if write is also an asynchronous method which returns a future, this map call will return a type like Future[Future[Result]].

    In the following code:

    import scala.concurrent.Future
    import scala.concurrent.ExecutionContext.Implicits.global
    
    val numF = Future{ 3 }
    
    val stringF = numF.map(n => Future(n.toString))
    
    val flatStringF = numF.flatMap(n => Future(n.toString))
    

    stringF is of type Future[Future[String]] while flatStringF is of type Future[String]. Most would agree, the second is more useful. Flat Map is therefore useful for composing multiple futures together.

    When you use for comprehensions with Futures, under the hood flatMap is being used together with map.

    import scala.concurrent.{Await, Future}
    import scala.concurrent.ExecutionContext.Implicits.global
    import scala.concurrent.duration._
    
    val threeF = Future(3)
    val fourF = Future(4)
    val fiveF = Future(5)
    
    val resultF = for{
      three <- threeF
      four <- fourF
      five <- fiveF
    }yield{
      three * four * five
    }
    
    Await.result(resultF, 3 seconds)
    

    This code will yield 60.

    Under the hood, scala translates this to

    val resultF = threeF.flatMap(three => fourF.flatMap(four => fiveF.map(five => three * four * five)))
    

提交回复
热议问题