Future与Promise in Scala

博客地址: 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!"))


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值