我有一个Set[Set[String], Set[String]]
的java.util.Set类型,我想将其转换为scala.immutable.Map[String, scala.immutable.Set[String]]
。映射就像最外层集合中第一组的每个元素映射到最外层集合的第二组。我尝试了表达式:
for (groupRole <- groupRoleAccess;
user <- groupService.getGroup(groupRole.groupId).getUsers.asScala;
permissions = roleService.getRole(groupRole.roleId).getPermissions.asScala)
yield Map(user, permissions)
其中groupRoleAccess
是最外面的集合,
getUsers
给了我最里面的第一组,
getPermissions
给了我最里面的第二组
但是,我得到的是Set[Map[String, Set[String]]]
和collection.mutable.Set
类型。我是否再次应用一个函数将此Set更改为我需要的Map?还是有更好的出路?
答案 0 :(得分:1)
您想将yield
更改为yield user -> permissions
。
这会给你一个Set[(String, Set[String])]
。然后你在它上面.toMap
,瞧!
或者(我不推荐这个,但只是为了完整性),你可以对你所拥有的结果.reduce(_ ++ _)
进行。这会将您的地图集合并到一个地图中。
(注意,如果有可能,结果将为空,那么您需要foldLeft(Map.empty[String, Set[String]]){ _ ++ _ }
而不是reduce
。)
答案 1 :(得分:0)
现在你正在做的是收集for循环添加到集合中的Map[String, Set[String]]
。
实现目标的一种方法是将for循环的结果输出到元组中,然后使用toMap函数
val x = for( user <- ...; permissions <- ...) yield (user, permissions)
x.toMap