将多个Future [Seq]连接为一个Future [Seq]

Ray*_*non 3 scala future seq circuit-breaker

没有Future,这就是我将所有较小的Seq合并为带有平面图的一个大Seq的方式

category.getCategoryUrlKey(id: Int):Seq[Meta] // main method
val appDomains: Seq[Int]

val categories:Seq[Meta] = appDomains.flatMap(category.getCategoryUrlKey(_))
Run Code Online (Sandbox Code Playgroud)

现在该方法getCategoryUrlKey可能会失败。我在前面放置了一个断路器,以避免在经过maxFailures之后为下一个元素调用它。现在,断路器不会返回a Seq而是aFuture[Seq]

lazy val breaker = new akka.pattern.CircuitBreaker(...)

private def getMeta(appDomainId: Int): Future[Seq[Meta]] = {
  breaker.withCircuitBreaker {
    category.getCategoryUrlKey(appDomainId)
  }
}
Run Code Online (Sandbox Code Playgroud)

如何遍历List appDomains并将结果合并为一个Future [Seq],有可能合并为Seq?

如果可以使用函数式编程,是否有一种方法可以在没有临时变量的情况下直接进行转换?

pam*_*amu 6

使用Future.sequence压缩期货序列

Future.sequence转换Seq[Future[T]]Future[Seq[T]]

你的情况TSeq。序列操作后,您将得到Seq [Seq [T]]。因此,在使用flatten进行序列操作之后,只需对其进行展平。

def squashFutures[T](list: Seq[Future[Seq[T]]]): Future[Seq[T]] =
  Future.sequence(list).map(_.flatten)
Run Code Online (Sandbox Code Playgroud)

您的代码成为

Future.sequence(appDomains.map(getMeta)).map(_.flatten)
Run Code Online (Sandbox Code Playgroud)