我在尝试解决方法的结果时遇到问题。更具体地说,我有:
def methodA(): Future[Either[Error, Seq[A]]]
在某些时候,我想为列表的每个元素调用此方法并合并结果。
像这样的东西:
val tes: Seq[Future[Either[Error, Seq[A]]]] = relevantRounds.map(round =>
methodA()
)
你知道我该如何解决这个问题吗Seq[Future[Either[Error, Seq[A]]]]
?
所以我最终想要的是Future[Either[Error, Seq[A]]]
包含整个列表结果的序列。
您可能正在寻找
def combine[A](s: Seq[Future[Either[Error, Seq[A]]]]) = {
Future.sequence(s)
.map(x => {
x.foldRight(Right(Seq()): Either[Error, Seq[A]]) {
(e, acc) => for (xs <- acc.right; x <- e.right) yield x ++ xs
}
}
)
}
如果您希望仅在前一个成功时才执行函数,请使用此
def combine[A](s: Seq[() => Future[Either[Error, Seq[A]]]]): Future[Either[Error, Seq[A]]] =
combine(Seq(), s)
def combine[A](acc: Seq[A], s: Seq[() => Future[Either[Error, Seq[A]]]]): Future[Either[Error, Seq[A]]] = s match {
case x +: Nil =>
val v = x.apply()
v.andThen {
case Success(Right(r)) => Success(Right(acc ++ r))
case Success(Left(l)) => Success(Left(l))
case Failure(f) => Failure(f)
}
case x +: xs =>
val v = x.apply()
v.andThen {
case Success(Right(r)) => combine(acc ++ r, xs)
case Success(Left(l)) => Success(Left(l))
case Failure(f) => Failure(f)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)