如何将价值提升为未来

Yan*_*san 1 scala

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

这有两种方法:

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

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

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

还有另一个赞成和缺点吗?还有其他解决方案吗?

Ser*_*gey 6

如果已经计算了你需要包装到未来的值(这是暗示的,因为t: T没有通过名称传递,因此已经知道),那么选项2就是这样做的方式,向下移动.

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

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

def lift[T](t: => T): Future[T] = Future.fromTry(Try(t))
Run Code Online (Sandbox Code Playgroud)

按名称参数将推迟计算,直到它包含在Try中,将异常(如果发生)转换为a Future.failed而不是抛出异常.