هر وقت یک زنجیره از Future ها داشته باشیم در صورت که از تابع map برای فراخوانی زنجیره ای این Future ها استفاده کنیم نتیجه از نوع Future ها تو در تو خواهد بود اما اگر از flatMap استفاده کنیم همه Future های تو در تو در قالب یک Future تبدیل خواهد شد.
از لحاظ مفهومی Future نیز مانند List ها یک Container محسوب می شود و مفهوم map و flatMap برای تمامی Container ها به همین مفهوم (یعنی یکی کردن Container در حالت flatMap) موجود است.
مثال زیر نوع خروجی هر کدام از دو تابع را نشان می دهد:
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
def calculateA = Future {
Thread.sleep(2000L)
"A Calculated 78.1"
}
def calculateB(aResult : String ) = Future {
Thread.sleep(2000L)
aResult + " + B Result Is 12"
}
calculateA.map(x => calculateB(x)) // return type is Future[Future[String]
calculateA.flatMap(x => calculateB(x)) //return type is Future[String]