Scala 如何将Twitter未来[Map[a,Future[C]]]转换为未来[Map[a,C]]
我正在尝试解决以下问题: 我有一个未来[地图[a,B]]。对于所有的B,我需要应用一种方法,将B转换为未来[C],我想返回一个未来[Map[a,C]] 以下是我目前掌握的代码:Scala 如何将Twitter未来[Map[a,Future[C]]]转换为未来[Map[a,C]],scala,twitter,map,future,finagle,Scala,Twitter,Map,Future,Finagle,我正在尝试解决以下问题: 我有一个未来[地图[a,B]]。对于所有的B,我需要应用一种方法,将B转换为未来[C],我想返回一个未来[Map[a,C]] 以下是我目前掌握的代码: def getClients(clientIds: Seq[Int]): Future[Map[Int, ClientData]] = { def getClientData(clientInfo: ClientInfo): Future[ClientData] = clientInfo match {
def getClients(clientIds: Seq[Int]): Future[Map[Int, ClientData]] = {
def getClientData(clientInfo: ClientInfo): Future[ClientData] =
clientInfo match {
case ValidInfo(info) => getData(info)
case _ => throw new Exception
}
client.getClients(clientIds) map {
_.toMap map {
case (clientId: Int, clientInfo: ClientInfo) =>
getClientData(clientInfo) map {
clientData => (clientId, clientData)
}
}
}
}
此代码错误,因为它返回了一个Iterable[Future[(Int,ClientData)]
For info getClients是一个节俭方法,它返回Future[Map[a,B]],其中Map是可变的,因此我需要首先使用toMap将其转换为不可变的Map
提前感谢您的帮助
scala> def f: Future[Map[String, Future[Int]]] = ???
f: Future[Map[String,Future[Int]]]
scala> def x = for {
| m <- f
| i = m.map{ case (k, fv) => fv.map{ k -> _ } }
| l <- Future.sequence(i)
| } yield l.toMap
x: Future[Map[String,Int]]
使用flatMap
将Iterable[Future[(A,B)]]转换为Future[Iterable[(A,B)]]
并展平Future[Future[…]]
:
scala> def x2 = x1.flatMap{ Future.sequence(_) }
x2: Future[immutable.Iterable[(String, Int)]]
将Iterable[(A,B)]
转换为Map[A,B]
:
scala> def x = x2.map{ _.toMap }
x: Future[Map[String,Int]]
对于com.twitter.util.Future
您应该使用collect
而不是sequence
和toSeq
在collect之前,因为它接受Seq
:
def x = for {
m <- f
i = m.map{ case (k, fv) => fv.map{ k -> _ } }
l <- Future.collect(i.toSeq)
} yield l.toMap
def x=for{
m fv.map{k->}
L
使用flatMap
将Iterable[Future[(A,B)]]转换为Future[Iterable[(A,B)]]
并展平Future[Future[…]]
:
scala> def x2 = x1.flatMap{ Future.sequence(_) }
x2: Future[immutable.Iterable[(String, Int)]]
将Iterable[(A,B)]
转换为Map[A,B]
:
scala> def x = x2.map{ _.toMap }
x: Future[Map[String,Int]]
对于com.twitter.util.Future
您应该在collect
之前使用collect
而不是sequence
和toSeq
,因为它接受Seq
:
def x = for {
m <- f
i = m.map{ case (k, fv) => fv.map{ k -> _ } }
l <- Future.collect(i.toSeq)
} yield l.toMap
def x=for{
m fv.map{k->}
非常感谢你的快速回复!但没有未来。骗局中的序列!有一个未来。collect但在这里似乎不起作用…@user3063038:你的scala版本是什么?在2.10.3中,我使用的是2.10.3,但是com.twitter.util.Future显然没有sequence方法:@user3063038:请参阅更新collect
应该可以正常工作(在toSeq
之后)。是的!同时我也试过了,效果很好!谢谢!非常感谢您的快速响应!但没有未来。骗局中的序列!有一个未来。collect但在这里似乎不起作用…@user3063038:你的scala版本是什么?在2.10.3中,我使用的是2.10.3,但是com.twitter.util.Future显然没有sequence方法:@user3063038:请参阅更新collect
应该可以正常工作(在toSeq
之后)。是的!同时我也试过了,效果很好!谢谢!