Scala 简明易读的地图计算方法?

Scala 简明易读的地图计算方法?,scala,Scala,鉴于 我想计算一张地图-- 我可以做以下简洁的事情: val roleToUsers: Map[String, List[User]] = ??? (对于(用户您可以使用模式匹配和大小写使参数的命名更加明确: (for (user <- users; role <- user.roles) yield (role, user)).groupBy(_._1).mapValues(_.map(_._2)) 也许是这样: (for { user <- users; role &l

鉴于

我想计算一张地图--

我可以做以下简洁的事情:

val roleToUsers: Map[String, List[User]] = ???

(对于(用户您可以使用模式匹配和
大小写
使参数的命名更加明确:

(for (user <- users; role <- user.roles) yield (role, user)).groupBy(_._1).mapValues(_.map(_._2))
也许是这样:

(for { user <- users; role <- user.roles } yield (role, user)) groupBy
     { case (role, user) => role } mapValues
        { roleUser => roleUser map { case (role, user) => user} }

你的意思是
Map[String,List[User]]]
?这就是你的例子的结果。试着看看这个问题,寻找替代方法:[在scala中反向转置一对多映射][1][1]:如果您不想,您不必使用匿名函数和下划线。我只是按照Emil的建议,尝试制作一个所有内容都完全命名的版本,而且…阅读起来更难。:((通常我是一个详细的人。)也许可以将语句分成多行,并添加几条简短的内联注释?
(for { user <- users; role <- user.roles } yield (role, user)) groupBy
     { case (role, _) => role } mapValues
        { roleUser => roleUser map { case (_, user) => user} }
(for { user <- users; role <- user.roles } yield (role, user)) groupBy
     { case (role, user) => role } mapValues
        { roleUser => roleUser map { case (role, user) => user} }
val lst = for {
  user <- users
  role <- user.roles
} yield (role, users collect {
  case user if user.roles contains role => user.name
})
val map = lst.toMap
users.flatMap(_.roles).distinct.map(role => 
  (role, users collect { 
    case user if user.roles contains role => user.name })).toMap