scala如何打印Future.sequence

时间:2017-03-23 13:51:27

标签: scala playframework

我有这个结构:

projectDao.getProjectIdsByUserId(userId).map(ids => ids.map(id => toProject(id, userId)))
  .map(Future.sequence(_)) /* transform Future[Seq[Future[...]]] to Future[Future[Seq[...]]] */

如何在控制台中打印此结果?

项目数据中的

应该是我想在控制台中打印的城市

是可能的,怎么样?

由于

2 个答案:

答案 0 :(得分:1)

我认为最直接的方法是通过foreach函数,例如:

val future = Future(...)
future.foreach(println)

请注意我单独调用foreach,在调用链中使用它会导致不同的结果类型。

在您的情况下,如果您的类型为Future[Future[...]],则需要致电flatten以获得展位Future[...],但我想您可以仔细检查您的链条,也许可以更换您与map的{​​{1}}来电之一,以简化它。我想这会是这样的:

flatMap

然后把它放在某处并记录:

projectDao
  .getProjectIdsByUserId(userId)
  .map(ids => ids.map(id => toProject(id, userId)))
  .flatMap(Future.sequence(_))

或者您可以使用val results = projectDao.getPro... results.foreach(println)

Future.traverse

答案 1 :(得分:1)

创建与原始问题相符的数据:

val originalFuts : Seq[Future[Int]] = 
  Seq(
    Future.successful(1), 
    Future.successful(2), 
    Future.successful(3)
  )

val fut : Future[Seq[Future[Int]]] = Future.successful(originalFuts)

您可以使用for comprehension访问基础Integer值:

for {
  seq <- fut
  f <- seq
  i <- f
} {
  println(i)
}

<强>简化

您可以通过微小修改使数据结构更简单

val futSeq = 
  projectDao
    .getProjectIdsByUserId(userId)
    .flatMap(ids => Future sequence (ids map (toProject(_, userId)))

然后可以用更简单的

处理
for {
  seq <- futSeq
  i   <- seq
} {
  println(i)
}