如何从 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)
建议,它更短一些,但 可能 可读性稍差。
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
?
有
根据评论,
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)
建议,它更短一些,但 可能 可读性稍差。