java.util.Set 转换为 scala.immutable.Map

java.util.Set conversion to scala.immutable.Map

我有一个 java.util.Set 类型的 Set[Set[String], Set[String]],我想将其转换为 scala.immutable.Map[String, scala.immutable.Set[String]]。映射就像最外层集合中第一个集合的每个元素映射到最外层集合的第二个集合。我尝试了一个 for 表达式:

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 还是有更好的出路?

现在您正在做的是收集 Map[String, Set[String]],for 循环将其添加到集合中。

完成你想做的事情的一种方法是将 for 循环的结果输出到一个元组中,然后使用 toMap 函数

val x = for( user <- ...; permissions <- ...) yield (user, permissions) 
x.toMap

您想将 yield 更改为 yield user -> permissions。 那会给你一个Set[(String, Set[String])]。然后你在上面做 .toMap,瞧!

或者(我不推荐这样做,只是为了完整起见),您可以只对现有结果执行 .reduce(_ ++ _)。这会将您的一组地图合并为一张地图。 (请注意,如果有可能结果为空,您需要 foldLeft(Map.empty[String, Set[String]]){ _ ++ _ } 而不是 reduce)。