Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将Twitter未来[Map[a,Future[C]]]转换为未来[Map[a,C]]_Scala_Twitter_Map_Future_Finagle - Fatal编程技术网

Scala 如何将Twitter未来[Map[a,Future[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 {

我正在尝试解决以下问题:

我有一个未来[地图[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 {
      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
之后)。是的!同时我也试过了,效果很好!谢谢!