java - 当原始 map 包含集合作为值时,如何创建反向 map ?

标签 java java-8 java-stream

假设我的原始 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

最佳答案

您可以使用 flatMapMap 分解为键值对(其中每个键和值都是一个 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/

相关文章:

java - Java 中返回原始数组的不一致

java - 这是从日期获取 UTC 的 java.sql.Timestamp 的正确方法吗?

java - 将参数传递给 HashMap 值中的函数

java - 在 Java 8 中使用Optional.empty 默认可选 orElse

java - Streams - parallel() + skip() 不显示元素

java - 更新 PATH 环境变量使 Eclipse 停止工作

java - 准备进行垃圾收集的对象,Java

java - 如何访问java Spring非 Controller 类中的属性文件

java - 如何使用 java 流比较两个 ArrayList 并使用过滤器获取 list1

java - 有状态和无状态 lambda 表达式有什么区别?