繁体   English   中英

斯卡拉如何打印Future.sequence

[英]scala how to print a Future.sequence

我有这个构造:

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

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

在项目数据中应该是我要在控制台中打印的城市

那有可能吗?

谢谢

我相信最直接的方法是通过一个foreach函数,例如:

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

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

在您的情况下,如果您具有Future[Future[...]] ,则需要调用flatten以获得平坦的Future[...] ,但我想您可以仔细检查您的链并也许替换其中一个使用flatMap进行map调用,以简化操作。 我猜可能是这样的:

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

然后将其放在某个地方并记录:

val results = projectDao.getPro...
results.foreach(println)

或者您可以使用Future.traverse

Future.traverse(projectDao.getProjectIdsByUserId(userId)) { id =>
  log.info(...)
  toProject(id, userId)
}

创建与您的原始问题匹配的数据:

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

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

您可以通过以下方式访问基础的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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM