结合多种期货进行理解

理解力是运行取决于多种期货的成功结果的代码块一个紧凑的方式。

f1, f2, f3 三个 Future[String] 分别包含字符串 one, two, three

val fCombined = 
    for {
        s1 <- f1
        s2 <- f2
        s3 <- f3
    } yield (s"$s1 - $s2 - $s3")

所有期货成功完成后,fCombined 将成为包含字符串 one - two - threeFuture[String]

请注意,此处假定使用隐式 ExectionContext。

另外,请记住,理解只是 flatMap 方法的一种语法糖 ,因此对于 body 来说,Future 对象构造将消除由期货包含的代码块的并发执行并导致顺序代码。你在例子中看到它:

val result1 = for {
  first <- Future {
    Thread.sleep(2000)
    System.currentTimeMillis()
  }
  second <- Future {
    Thread.sleep(1000)
    System.currentTimeMillis()
  }
} yield first - second

val fut1 = Future {
  Thread.sleep(2000)
  System.currentTimeMillis()
}
val fut2 = Future {
  Thread.sleep(1000)
  System.currentTimeMillis()
}
val result2 = for {
  first <- fut1
  second <- fut2
} yield first - second

result1 对象所包含的值将始终为负值,而 result2 将为正值。

有关 for comprehensionyield 的更多详细信息,请参阅 http://docs.scala-lang.org/tutorials/FAQ/yield.html