我有以下功能:
def countAllFriends(currUser: String, members: List[String]): Future[Map[String, Integer]] = {
val results: List[Future[List[String]]] = members.map(currUser => retrieveAllFriends( currUser))
//go through the results, and return a future of a map of usernames to the number of times that username exists in the list
}
如何实现该功能,以便获得Future[Map[String, Integer]]
的返回类型?
如果未来失败,那么我不希望整件事情失败,我只想在地图上有一个名为“失败”的特殊条目。这将计算失败期货的数量。
答案 0 :(得分:3)
首先使用Future.sequence
获取Future[List[List[String]]
:
val p: Future[List[List[String]]] = Future.sequence(results)
然后flatMap
未来和内部列表并使用groupBy
和map
:
val g: Future[Map[String, Int]] = p.flatMap { listOfList =>
Future(listOfList.flatten.groupBy(identity).map(maps => (maps._1, maps._2.length)))
}
编辑:
如果你想计算期货数量失败,你可以使用它:
val futuresWithRecover: List[Future[List[String]]] =
results.map(f => f.map(identity).recover {case _ => List("failures") })
然后过程是一样的:
val p: Future[List[List[String]]] = Future.sequence(futuresWithRecover)
val g: Future[Map[String, Int]] = p.flatMap { listOfList =>
Future(listOfList.flatten.groupBy(identity).map(maps => (maps._1, maps._2.length)))
}
第二种方法尚未经过测试。