Multithreading 如何从尝试中同时创造未来?
scalaMultithreading 如何从尝试中同时创造未来?,multithreading,scala,concurrency,future,Multithreading,Scala,Concurrency,Future,scalaFuture有一个方法 创建已完成的具有指定结果的未来,或 例外 问题是新创建的未来已经完成。是否可以同时对Try进行评估 例如,给定一个返回Try的函数: def foo() : Try[Int] = { Thread sleep 1000 Success(43) } 如何同时对foo进行评估 粗略的方法是简单地围绕函数包装一个Future: val f : Future[Try[Int]] = Future { foo() } 但所需的返回类型将是Future[Int]
Future
有一个方法
创建已完成的具有指定结果的未来,或
例外
问题是新创建的未来
已经完成。是否可以同时对Try
进行评估
例如,给定一个返回Try
的函数:
def foo() : Try[Int] = {
Thread sleep 1000
Success(43)
}
如何同时对foo
进行评估
粗略的方法是简单地围绕函数包装一个Future
:
val f : Future[Try[Int]] = Future { foo() }
但所需的返回类型将是Future[Int]
val f : Future[Int] = ???
有效地,如何在未来的中将Try
展平,类似于fromTry
方法?
然而,在构建完整的未来之前,问题和答案将等待对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)
的建议,它略短一些,但可读性可能稍差。正如我常说的,这是你的朋友--Future.delegate(Future.fromTry(foo())
不是吗。您正在寻找的是未来(foo.get)
@Dima,只有当尝试成功时,它才有效,而不是失败
@RamónJRomeroyVigil nope。这两种方法都有效。试试看:)@Dima Playing code golf:)我认为Luis的挥杆是正确的,因为delegate
在执行上下文中按名称参数执行。我的swing:Future(foo()).flatMap(Future.fromTry)