假设我的原始 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(??)
发布了类似的问题here ,但这仅适用于单值 Map
。
最佳答案
您可以使用 flatMap
将 Map
分解为键值对(其中每个键和值都是一个 String
),并且然后根据需要收集它们:
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]}
关于java - 当原始 map 包含集合作为值时,如何创建反向 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54704346/