首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将价值提升到未来

如何将价值提升到未来
EN

Stack Overflow用户
提问于 2016-06-01 08:32:53
回答 1查看 1.1K关注 0票数 1

有时,我们必须将一个值提升到Future中。

以下是两种方法:

  • 解决方案1:def lift[T](t: T) : Future[T] = Future(t)
  • 解决方案2:def lift[T](t: T) : Future[T] = Future.successful(t)

据我所知,解决方案2似乎更有表现力,因为它避免了线程机制和可能的上下文切换。

还有别的正反两面吗?还有别的解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-01 08:54:25

如果您需要包装到未来的值已经计算出来(这是暗示的,因为t: T不是按名称传递的,因此已经知道了),那么选项2就是这样做的,就顺其自然。

选项1涉及一个上下文切换,它实际上可能会降低性能。

但是,有时您需要执行几个廉价的内存中计算(例如,没有IO的参数验证),因此需要一个FutureFuture.successful(throw new Exception)不会产生未来,但会抛出异常--这可能是意外的,因为我们倾向于将未来作为一种语言结构来处理,它的执行流程是可以区分的,而且通常不会在异步代码中处理同步异常。为了保护自己不受这种情况的影响,请考虑另一种选择:

代码语言:javascript
复制
def lift[T](t: => T): Future[T] = Future.fromTry(Try(t))

名参数将推迟计算,直到将其包装在Try中,如果出现异常,则将其转换为Future.failed,而不是抛出异常。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37563420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档