如何将Twitter未来[Map [A​​,Future [C]]]转换为未来[Map [A​​,C]]

 龙马爱梓喵_me 发布于 2023-02-13 09:58

我想解决以下问题:

我有一个未来[地图[A,B]].对于所有B,我需要应用一个将B转换为Future [C]的方法,并且我想要回馈Future [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)]]

对于info getClients是一个thrift方法,它返回Map [Map [A​​,B]],其中Map是可变的,所以我需要首先使用toMap将它转换为不可变的映射.

预先感谢您的帮助!

1 个回答
  • 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]]
    

    一步步:

    转换Future[Map[A, Future[B]]]Future[Iterable[Future[(A, B)]]]:

    scala> def x1 = f.map{ _.map{ case (k, fv) => fv.map{ k -> _ } } }
    x1: Future[Iterable[Future[(String, Int)]]]
    

    转换Iterable[Future[(A, B)]]Future[Iterable[(A, B)]]flatten Future[Future[...]]使用flatMap:

    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的,而不是sequencetoSeq之前collect因为它接受Seq:

    def x = for {
      m <- f
      i = m.map{ case (k, fv) => fv.map{ k -> _ } }
      l <- Future.collect(i.toSeq)
    } yield l.toMap
    

    2023-02-13 10:01 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有