考虑到Future
结果上的任何模式匹配都匹配Success[A]
和Failure[A]
(onComplete()
,andThen()
)(因为他们期望{{1}作为一个参数,直接或通过部分函数),是否有一种情况,我想明确说明函数是Try[A]
类型?
答案 0 :(得分:7)
Scala中有各种构造,其中包含 failure 案例。有Option
,Either
,Try
和Future
。 (Future
的主要观点是抽象异步操作,错误处理是为了方便起见。 Scalaz还有更多:Validation
(Disjunction
和Maybe
更好Either
和Option
)。
他们都对错误的价值观有所不同。然而,Try
和Future
非常相似,都包裹Throwable
。所以恕我直言,Future[Try[A]]
不会添加太多信息(关于错误)。与拥有Future[Future[A]]
或Try[Try[A]]
相比。 OTOH Future[Option[A]]
或Future[Either[MyError, A]]
对我有意义。
可能会有一个坐在你身边的地方,例如可能会失败f: A => B
和g: B => C
,你想避免在ExecutionContext
中创建太多任务:
val a: Future[A] = ???
val c: Future[C] = a.map(f).map(g) // two tasks, not good
val c2: Future[Try[C]] = a.map(x => Try { f(x) } map g ) // one task, maybe better
// get will throw, but exception will be catched by Future's map
// Almost no information is lost compared to `c2`
// You cannot anymore distinguish between possible error in `a`
// and exceptions thrown by `f` or `g`.
val c3: Future[C] = a.map(x => Try { f (x) }.map(g).get)
在这种情况下,我宁愿重构f
和g
以获得更好的类型,至少:f: A => Option[B]
和g: B => Option[C]
然后,以Future[Option[C]]
结束。
答案 1 :(得分:6)
Try[A]
表示可能失败的同步计算。
Future[A]
表示可能失败的异步计算。
在此定义下,Future[Try[A]]
表示在异步计算(可能失败)内执行的同步计算(可能失败)的结果。
有意义吗?不是我,但我愿意接受创造性的解释。