2015-09-28 159 views
2

我有一個元組,看起來像這樣的Seq斯卡拉轉化序列與未來

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

我想變成下面這樣的:

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

這甚至可能嗎?

回答

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

比截至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

+0

遍歷更好,因爲它不會創建中間集合。好的ans。 – curious