我有以下元组-(t1,t2):(Try,Try)
我想检查两个都成功还是一个失败,但是要避免代码重复。就像是:
(t1,t2) match {
case (Success(v1),Success(v2)) => new MyClass(v1,v2)
case (Failure(e),_) | (_,Failure(e)) => println(e.getMessage)
}
当然,第二条语句不起作用,因为我需要提供不同的提取变量。但是然后我必须检查它们,因为我不知道哪个失败并且实际上包含Throwable。我希望Try像Future一样,所以它具有Try.sequence(t1,t2)。
任何想法如何使它优雅地工作?
您可以针对这种(_, Failure(e))
情况进行尾部递归调用:
@annotation.tailrec
def apply(t1: Try[Any], t2: Try[Any]): Any =
(t1, t2) match {
case (Success(v1), Success(v2)) => new MyClass(v1,v2)
case (Failure(e), _) => println(e.getMessage)
case _ => apply(t2, t1)
}
猫让您优雅地做到这一点。对于任何F[_]: Traverse
和G[_]: Applicative
,它都定义了Future.sequence
:
def sequence(fa: F[G[A]]): G[F[A]]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句