scala - 解析 Seq[Future[Either[A, Seq[B]]]] - Scala Cats

标签 scala future scala-cats cats-effect

我在尝试解析方法的结果时遇到问题。更具体地说,我有:

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/

相关文章:

scala - 蛋糕图案和类型

scala - Actor 的接收方法中的多个 Future 调用

scala - 使用 scala fs2 文件流从文件中删除过滤行

c++ - 是什么给了 std::future 一些共享状态

scala - 对Cats Effect IO进行认真评估并忘记行为

scala - 类路径中缺少符号 'type cats.MonadFilter'

java - 从 Executor 创建 ExecutorService

scala - 在暂存或发布docker时sbt无法生成bin目录+其他问题

scala - 为什么我在这个简单的 Scala 代码上出现错误?

scala - 计算 future 列表并返回结果 future