[英]Reverse of Future.sequence
我知道Future.sequence
調用可以將List[Future[T]]
轉換為Future[List[T]]
,但如果我想Future.sequence
呢?
我想將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中提取的每條記錄轉換成一條消息,然后將其發送給一個調用actor。
抱歉,我不認為這是可能的。
Future[List[T]]
可以用空列表,包含一個元素的列表或任意數量的元素來完成。
因此,如果您將其轉換為List[Future[T]]
,該列表將包含多少個Futures?
而不是使用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 }
}
你為什么要這樣做? 你想達到什么目的? 一旦您的未來結算,列表中的所有項目都可用,因此您可以通過將每個項目提升到自己的未來而獲得很少的收益。
無論如何:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.