我在尝试编写返回Future [Map [Int,Long]]的方法时遇到问题。
我正在进行一些迭代,回到未来[未来[..]]。所以我尝试了flatMap身份。
请参阅下面的我现在收到的代码和错误消息。我不知道此刻发生了什么。
def aggregate(permissions: Vector[Permission]): Map[Int, Long]
def calculate(roleProfile: RoleProfile): Future[Map[Int, Long]] = {
val roleIds = roleProfile.roles.map(r => r.id)
db.run(permissionDao.getByRoles(roleIds.toList)).map {
permissions =>
aggregate(permissions)
}
}
def generate(roleGroupId: Int): Future[Map[Int, Long]] = {
for {
roleGroup <- roleGroupService.getById(roleGroupId)
roles <- roleGroupService.getRolesByGroupId(roleGroupId)
} yield {
calculate(RoleProfile(roleGroup.get.id, roles.toSet)) //flatMap identity
}
}
我收到方法错误消息&#39;计算&#39;:
type mismatch;
[error] found : scala.concurrent.Future[Map[Int,Long]]
[error] required: Map[Int,Long]
[error] calculate(RoleProfile(roleGroup.get.id, roles.toSet)) //flatMap identity
现在,如果删除了“flatMap identity&#39;的评论”。我收到这个错误:
type mismatch;
[error] found : Map[Int,Long] => Map[Int,Long]
[error] required: Map[Int,Long] => scala.concurrent.Future[?]
[error] calculate(RoleProfile(roleGroup.get.id, roles.toSet)) flatMap identity
我很困惑,我怎么能让它返回Future [Map [Int,Long]]。
更重要的是,这里发生的事情我似乎并不理解。如果你非常感激,请把事情搞清楚。
答案 0 :(得分:5)
由于calculate
与您的getById
等调用一样,返回Future
,您应该只需将其添加到for-comprehension的主要部分,例如:
def generate(roleGroupId: Int): Future[Map[Int, Long]] = {
for {
roleGroup <- roleGroupService.getById(roleGroupId)
roles <- roleGroupService.getRolesByGroupId(roleGroupId)
profile <- calculate(RoleProfile(roleGroup.get.id, roles.toSet))
} yield { profile }
}