我知道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中提取的每条记录转换成一条消息,然后将其发送给一个主叫演员。
答案 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)