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
。
我有一个 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
。