如果没有 Future,这就是我将所有较小的 Seq 组合成一个大 Seq 的方式flatmap
category.getCategoryUrlKey(id: Int):Seq[Meta] // main method
val appDomains: Seq[Int]
val categories:Seq[Meta] = appDomains.flatMap(category.getCategoryUrlKey(_))
现在的方法getCategoryUrlKey
可能会失败。我在前面放置了一个断路器,以避免在经过一段时间后为下一个元素调用它最大失败次数。现在断路器不会返回Seq
but a Future[Seq]
lazy val breaker = new akka.pattern.CircuitBreaker(...)
private def getMeta(appDomainId: Int): Future[Seq[Meta]] = {
breaker.withCircuitBreaker {
category.getCategoryUrlKey(appDomainId)
}
}
如何迭代列表appDomains
并将结果组合成一个 Future[Seq] ,可能组合成 Seq 吗?
如果函数式编程适用的话,有没有办法直接转换而不需要临时变量?
使用 Future.sequence 压缩 future 的 seq
Future.sequence
皈依者Seq[Future[T]]
to Future[Seq[T]]
在你的情况下T
is Seq
。序列运算后,您将得到 Seq[Seq[T]]。因此,只需在序列操作后使用 flatten 将其展平即可。
def squashFutures[T](list: Seq[Future[Seq[T]]]): Future[Seq[T]] =
Future.sequence(list).map(_.flatten)
你的代码变成
Future.sequence(appDomains.map(getMeta)).map(_.flatten)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)