当前位置:  开发笔记 > 编程语言 > 正文

将Future [List [String]]转换为List [String]

如何解决《将Future[List[String]]转换为List[String]》经验,为你挑选了1个好方法。

我有以下代码:

Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList))

我收到以下错误:

[error]  found   : scala.concurrent.Future[List[String]]
[error]  required: List[String]
[error]           Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList)),
[error]                                                       ^
[error] one error found

所以我想我必须转换Future[List[String]]List[String].我是scala的新手,如果这太容易了,那就很抱歉.

完整代码:

  def find(loginInfo: LoginInfo): Future[Option[models.admin.User]] = {
val userQuery = for {
  dbLoginInfo <- loginInfoQuery(loginInfo)
  dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id)
  dbUser <- User.filter(_.userid === dbUserLoginInfo.userid)
} yield dbUser

db.run(userQuery.result.headOption).map { dbUserOption =>
  dbUserOption.map { user =>
    val permissionQuery = for {
      dbUserPermission <- Userpermission.filter(_.userid === user.userid)
      dbPermission <- Permission.filter(_.id === dbUserPermission.permissionid)
    } yield dbPermission

    val rolePermissionQuery = for {
      dbUserRole <- Userrole.filter(_.userid === user.userid)
      dbRole <- Role.filter(_.id === dbUserRole.roleid)
      dbRolePermission <- Rolepermission.filter(_.roleid === dbRole.id)
      dbPermission <- Permission.filter(_.id === dbRolePermission.permissionid)
    } yield dbPermission

    val unionPermissionQuery = permissionQuery union rolePermissionQuery

    models.admin.User(
      UUID.fromString(user.userid),
      user.firstname,
      user.lastname,
      user.jobtitle,
      loginInfo,
      user.email,
      user.emailconfirmed,
      Some(db.run(unionPermissionQuery.result).map(_.map(_.name).toList)),
      user.enabled)
  }
}

我只想获得用户,然后填写所有权限.分配给用户的角色继承的个人权限和权限.

获取用户然后执行另一个请求以获取基于用户ID的权限更好吗?我不这么认为.



1> Andreas Neum..:
关于期货的一般信息

您可以在 http://docs.scala-lang.org/overviews/core/futures.html上找到所需的所有期货信息.

可能的方法是等待结果,但在prod应用程序中使用并不好.

val myFutureResult : Future[T] = Future {...}
val myResult : T = Await.result(myFutureResult, secondsToWait seconds)

通常情况下,不是等待结果并将其存储在变量中,您可以map将来组成它并且仅在最后时刻使用Await.

val myFutureResult : Future[T] = Future {...}
def myFunctionOnT(in: T) = ...

for {res <- myFutureResult } yield myFunctionOnT(res)
游戏和期货

播放本身可以Future[T]默认使用Action.async {}而不是在Action{}这里你可以找到更多:https://www.playframework.com/documentation/2.5.x/ScalaAsync

此信息适用于扩展问题
db.run(unionPermissionQuery.result).map(_.map(_.name).toList).map { permission =>

models.admin.User(
  UUID.fromString(user.userid),
  user.firstname,
  user.lastname,
  user.jobtitle,
  loginInfo,
  user.email,
  user.emailconfirmed,
  Some(permission),
  user.enabled)
  }


这是一个答案.但OP很可能会提出错误的问题.
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有