如何处理此期货结果列表

时间:2014-08-14 19:24:50

标签: scala

我有以下功能:

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]]的返回类型?

如果未来失败,那么我不希望整件事情失败,我只想在地图上有一个名为“失败”的特殊条目。这将计算失败期货的数量。

1 个答案:

答案 0 :(得分:3)

首先使用Future.sequence获取Future[List[List[String]]

val p: Future[List[List[String]]] = Future.sequence(results)

然后flatMap未来和内部列表并使用groupBymap

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)))
}

第二种方法尚未经过测试。