如何从 Try 同时创建 Future?

How to concurrently create Future from Try?

scala Future 有一个 fromTry 方法

Creates an already completed Future with the specified result or exception.

问题是新创建的Future已经完成了。是否可以同时完成 Try 的评估?

例如,给定一个 return 是 Try:

的函数
def foo() : Try[Int] = {
  Thread sleep 1000
  Success(43)
}

foo的求值如何并发进行?

粗略的方法是简单地用 Future 包裹函数:

val f : Future[Try[Int]] = Future { foo() }

但所需的 return 类型将是 Future[Int]

val f : Future[Int] = ???

实际上,如何在类似于 fromTry 方法的 Future 中展平 Try

,但是问题&答案在构造完成的Future之前等待Try的评估。

根据评论,

Scala >= 2.13:

val f : Future[Int] = Future.delegate(Future.fromTry(foo()))

Scala < 2.13:

val f : Future[Int] = Future(foo()).flatMap(Future.fromTry)

最少的仪式大概是:

Future.unit.transform(_ => foo())

特别提到@Dima 的 Future(foo().get) 建议,它更短一些,但 可能 可读性稍差。