Scala用未来转换Seq

时间:2015-09-28 10:03:42

标签: scala future

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

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

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

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

这甚至可能吗?

2 个答案:

答案 0 :(得分:5)

这应该可以解决问题

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)))
})

答案 1 :(得分:4)

比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