Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何从尝试中同时创造未来?_Multithreading_Scala_Concurrency_Future - Fatal编程技术网

Multithreading 如何从尝试中同时创造未来?

Multithreading 如何从尝试中同时创造未来?,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]

scala
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)