有时,我们必须将一个值提升到Future中。
以下是两种方法:
def lift[T](t: T) : Future[T] = Future(t)def lift[T](t: T) : Future[T] = Future.successful(t)据我所知,解决方案2似乎更有表现力,因为它避免了线程机制和可能的上下文切换。
还有别的正反两面吗?还有别的解决办法吗?
发布于 2016-06-01 08:54:25
如果您需要包装到未来的值已经计算出来(这是暗示的,因为t: T不是按名称传递的,因此已经知道了),那么选项2就是这样做的,就顺其自然。
选项1涉及一个上下文切换,它实际上可能会降低性能。
但是,有时您需要执行几个廉价的内存中计算(例如,没有IO的参数验证),因此需要一个Future。Future.successful(throw new Exception)不会产生未来,但会抛出异常--这可能是意外的,因为我们倾向于将未来作为一种语言结构来处理,它的执行流程是可以区分的,而且通常不会在异步代码中处理同步异常。为了保护自己不受这种情况的影响,请考虑另一种选择:
def lift[T](t: => T): Future[T] = Future.fromTry(Try(t))名参数将推迟计算,直到将其包装在Try中,如果出现异常,则将其转换为Future.failed,而不是抛出异常。
https://stackoverflow.com/questions/37563420
复制相似问题