从IndexedSeq [Future [Foo]]转换为Future [IndexedSeq [Foo]]的正确方法是什么?

时间:2014-05-22 01:48:35

标签: scala

根据标题,给定IndexedSeq[Future[Foo]],我希望产生一个未来,当原始IndexedSeq的所有期货都已完成时完成。最好的方法是什么?如果列表中有Future.sequence之类的内容,是否有一种很好的方法来链接呼叫?

考虑两种情况:

bar.createFuture(blah)     // Future[A]
  .flatMap(f1)             // f1: A -> Future[B]
  .flatMap(f2)             // f2: B -> Future[C]
  .map(f3)                 // f3: C -> IndexedSeq[Future[D]],
                           //   but would like to call flatMap(f3...???)

bar.createIndexedSeq(blah) // IndexedSeq[A]
  .map(f1)                 // f1: A -> B
  .map(f2)                 // f2: B -> C
  .map(f3)                 // f3: C -> Future[D]
  .???                     // convert IndexedSeq[Future[D]]
                           //   into Future[IndexedSeq[D]]
  .map(f4)                 // f4: IndexedSeq[D] -> E

1 个答案:

答案 0 :(得分:3)

Future.sequence会从IndexedSeq[Future[Foo]]转换为Future[IndexedSeq[Foo]],事实上它会将任何期货集合转换为持有相同类型集合的未来。

您的第一个用例可以写成:

for {
  x <- bar.createFuture(blah)
  y <- f1(x)
  z <- f2(y)
  w <- Future.sequence(f3(z))
} yield w

你的第二篇文章可以写成:

Future.sequence(bar.createIndexedSeq(blah) map f1 map f2 map f3) map f4

Future.traverse

Future.traverse(bar.createIndexedSeq(blah) map f1 map f2)(f3) map f4