结合多种期货进行理解
理解力是运行取决于多种期货的成功结果的代码块一个紧凑的方式。
用 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 - three
的 Future[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 comprehension 和 yield
的更多详细信息,请参阅 http://docs.scala-lang.org/tutorials/FAQ/yield.html