如何将价值提升为未来

时间:2016-06-01 08:32:54

标签: scala

有时,我们必须将值提升为Future

以下是两种方法:

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

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

据我所知,解决方案2似乎更具性能,因为它避免了线程机制,可能还有上下文切换

还有其他赞成还是缺点? 还有其他解决方案吗?

1 个答案:

答案 0 :(得分:6)

如果已经计算了你需要包装到未来的值(这是暗示的,因为"OS"没有通过名称传递,因此已经知道了),那么选项2是这样做的方法,手下来。

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

但是,有时您需要执行几个廉价的内存计算(例如参数验证,没有IO),并且需要t: T作为结果。 Future不会产生Future,但会引发异常 - 这可能是意料之外的,因为我们倾向于将Futures作为具有其独特执行流程的语言构造处理,并且通常不会处理同步异步代码中的异常。为了保护自己免受这种情况的影响,请考虑另一种选择:

Future.successful(throw new Exception)

按名称参数将推迟计算,直到它包含在Try中,将异常(如果发生)转换为def lift[T](t: => T): Future[T] = Future.fromTry(Try(t)) 而不是抛出它。