反向Future.sequence

时间:2017-07-11 22:26:12

标签: scala

我知道Future.sequence来电可以将List[Future[T]]转换为Future[List[T]],但如果我想反过来怎么办呢?

我想将Future[List[T]]转换为List[Future[T]]

我想这样做的原因如下:

我向使用Slick 3查询数据库的actor发送消息。 Slick查询返回list: Future[List[T]]。如果我可以将此list转换为list: List[Future[T]],那么我可以这样做:

list.map(convertToMessage).foreach(m => m pipeTo sender())

所以基本上我想将从DB中提取的每条记录转换成一条消息,然后将其发送给一个主叫演员。

3 个答案:

答案 0 :(得分:3)

我不认为这是可能的,对不起。

Future[List[T]]可以填写空列表,包含一个元素的列表或任意数量的元素。

因此,如果您将其转换为List[Future[T]],该列表中将包含多少个期货?

答案 1 :(得分:3)

而不是使用akkas pipeTo模式,您可以执行以下操作:

// capture the sender, before the future is started - just like pipeTo does
val s = sender()
futureOfListOfFoo.foreach { listOfFoo =>
  listOfFoo.map(convertToMessage).foreach { foo => s ! foo }
}

答案 2 :(得分:1)

你为什么要这样做?你想达到什么目的?一旦您的未来结算,列表中的所有项目都可用,因此您可以通过将每个项目提升到自己的未来而获得很少的收益。

反正:

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

// Assuming some starting future.
val foo: Future[List[String]] = Future.successful(List("foo"))

// This is pointless, because all we're doing is lifting each item in the list into its own already resolved future.
val bar: Future[List[Future[String]]] = foo.map(_.map(Future.successful))

// NB: you shouldn't use Await.
val baz: List[Future[String]] = Await.result(bar, 0.nanos)