Scala 用 Future 转换 Seq

Scala transforming a Seq with Future

我有一个 Seq 的元组,如下所示:

Seq[(Future[Iterable[Type1]], Future[Iterator[Type2]])]

我想将其转换为以下内容:

Future[Seq([Iterable[Type1], [Iterable[Type2])]

这可能吗?

这应该可以解决问题

val a: Seq[(Future[Iterable[Type1]], Future[Iterable[Type2]])] = ...

val b: Future[Seq[(Iterable[Type1], Iterable[Type2])]] = Future.sequence(a.map{
  case (l, r) => l.flatMap(vl => r.map(vr => (vl, vr)))
})

比 Till Rohrmann 的回答简单一些。未经测试,但应该可以。

val seq: Seq[(Future[Iterable[Type1]], Future[Iterable[Type2]])] = ...

val seq2 = Future.traverse(seq) { case (f1, f2) => f1.zip(f2) } 

val seq1 = seq.map { case (f1, f2) => f1.zip(f2) } 
// Seq[Future[(Iterable[Type1], Iterable[Type2])]]

val seq2 = Future.sequence(seq1)
// Future[Seq([Iterable[Type1], [Iterable[Type2])]

如果您确实有 Iterator[Type2],如问题所示,请使用 f2.map(_.toIterable) 而不是 f2