java - 当原始地图包含集合作为值时如何创建反向地图?
问题描述
假设我的原件Map
包含以下内容:
Map<String, Set<String>> original = Maps.newHashMap();
original.put("Scott", Sets.newHashSet("Apple", "Pear", "Banana");
original.put("Jack", Sets.newHashSet("Banana", "Apple", "Orange");
我想创建一个Map
包含以下内容的反转:
"Apple": ["Scott", "Jack"]
"Pear": ["Scott"]
"Banana": ["Scott", "Jack"]
"Orange": ["Jack"]
我知道它可以以旧方式(Java 8 之前)完成,但是如何使用 Java Stream API 实现相同的功能?
Map<String, Set<String>> reversed = original.entrySet().stream().map(x -> ????).collect(??)
这里发布了类似的问题,但这仅适用于单值Map
s。
解决方案
您可以使用 将其分解Map
为键值对(其中每个键和值都是一个String
)flatMap
,然后根据需要收集它们:
Map<String,Set<String>> rev =
original.entrySet ()
.stream ()
.flatMap (e -> e.getValue ()
.stream ()
.map (v -> new SimpleEntry<String,String>(v,e.getKey ())))
.collect(Collectors.groupingBy (Map.Entry::getKey,
Collectors.mapping (Map.Entry::getValue,
Collectors.toSet())));
System.out.println (rev);
输出:
{Apple=[Jack, Scott], Pear=[Scott], Orange=[Jack], Banana=[Jack, Scott]}
推荐阅读
- windows - 在 VSCode (Windows) 中调试时出错
- java - 构建 org.hibernate.hql.internal.ast.QuerySyntaxException 时出错:table_name 未映射
- python - 声明一个未知数量列表的空数组,然后访问它的项目?
- .net - PowerShell 获取文件 MD5 作为 base64 字符串
- c - /proc/{pid}/stack 在 linux 中是如何工作的?
- python - 如何修复 python 3.8 中的 pyttsx3 模块错误
- api - 如何结合 url 和 string 进行 api 调用
- weaviate - 对字典列表的 CRUD 支持
- r - 交互图的平均线
- gojs - 如何在拖动链接时将装饰或工具提示添加到 (Re-)LinkingTool 的临时ToPort 对象