博客地址: http://blog.csdn.net/yueqian_zhu/
所谓Future,是一种用于指代某个尚未就绪的值的对象。而这个值,往往是某个计算过程的结果。
一、创建
创建future对象最简单的方法是调用future方法,该future方法启用异步(asynchronous)计算并返回保存有计算结果的futrue,一旦该future对象计算完成,其结果就变的可用。想future方法正常执行,需要执行上下文执行提交给他们的任务,也可把执行上下文看作线程池,这对于future方法来说是必不可少的,因为这可以处理异步计算如何及何时被执行。我们可以定义自己的执行上下文,并在future上使用它。import ExecutionContext.Implicits.global 如:导入默认的全局执行上下文
二、回调函数
注册回调最通常的形式是使用OnComplete方法,即创建一个Try[T] => U
类型的回调函数。如果future成功完成,回调则会应用到Success[T]类型的值中,否则应用到Failure[T]类型的值中。或注册一个仅仅处理成功的函数(onSuccess),或注册一个仅仅处理失败的函数(onFailure)
三、map/flatMap
map能够创建一个新future对象。如果是在Failure实例上调用的,就直接返回这个实例。如果是在 Success 实例上调用的,则执行相应的方法。从以下返回的类型可以看出区别。
val numF = Future{ 3 }
val stringF: Future[Future[String]] = numF.map(n => Future(n.toString))
val flatStringF: Future[String] = numF.flatMap(n => Future(n.toString))
四、recover/recoverWith
recover能够创建一个新future对象,它接受一个偏函数,并返回另一个Future。 如果 recover
是在 Success 实例上调用的,那么就直接返回这个实例,否则就调用偏函数。 如果偏函数为给定的 Failure
定义了处理动作, recover
会返回 Success
,里面包含偏函数运行得出的结果,否则最终产生结果的future也会失败并返回同样的Throwable。
recoverWith与recover的不同在于这个偏函数的类型。如:
f recover { case cause => throw new Exception("Something went wrong", cause) }
f recoverWith{
case ex:Exception => Future.failed(new Exception("foo", ex))
}
五、
fallbackTo
future1 fallbackTo future2:
1、future1成功时返回结果
2、future1失败,future2成功时返回future2的结果
3、都失败,返回future1的异常对象
六、andThen
经andThen返回的新Future无论原Future成功或失败都会返回与原Future一模一样的结果。目的是保证多个andThen之间的顺序执行
七、promise
1、
val p = promise[T]
val f = p.future
p success result//将result结果放入promise,此时,f可以通过回调(如onSuccess方法)来获取结果。
p failure (new IllegalStateException)//将异常结果放入promise,此时,f可以通过回调(如onFailure方法)来获取结果,但是这时通过onSuccess是获取不到的。
promises具有单赋值语义。因此,它们仅能被实现一次。在一个已经计算完成的promise或者failed的promise上调用success方法将会抛出一个IllegalStateException异常。
2、completeWith方法将用另外一个future完成promise计算
val f = future { 1 }
val p = promise[Int]
p completeWith f
p.future onSuccess {
case x => println(x)
}
3、用 Promise 伴生对象创建一个已经完成的 Future, 它可以是成功:val future = Promise.successful("Yay!")
或失败:val otherFuture = Promise.failed[String](new IllegalArgumentException("Bang!"))