我在尝试解析方法的结果时遇到问题。更具体地说,我有:
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)
}
}
关于scala - 解析 Seq[Future[Either[A, Seq[B]]]] - Scala Cats,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56000842/