反转映射 <String, List<String>> 使用 Java 8 流

问题描述 投票:0回答:3

我需要使用 Java 8 将

<String, List<String>>
的映射反转为
Map<String,String>
,并假设值是唯一的。例如,

输入地图-

{"Fruit" -> ["apple","orange"], "Animal" -> ["Dog","Cat"]}

输出图

{"apple" -> "Fruit", "orange" -> "Fruit", "Dog"->"Animal", "Cat" -> "Animal"}
Map <String, String> outputMap = new HashMap<>();
for (Map.Entry<String, List<String>> entry : inputMap.entrySet()) {
    entry.getValue().forEach(value -> outputMap.put(value, entry.getKey()));
}   

这是对的吗?我们可以使用 Java 8 流来实现这一点吗?

java collections java-8 java-stream
3个回答
1
投票

这样做:

public class InverterMap {
    public static void main(String[] args) {

        Map<String, List<String>> mp = new HashMap<String, List<String>>();
        mp.put("Fruit", Arrays.asList("Apple", "Orange"));
        mp.put("Animal", Arrays.asList("Dog", "Cat"));
        System.out.println(mp);  // It returned {Fruit=[Apple, Orange], Animal=[Dog, Cat]}

        Map<String, String> invertMap = mp.entrySet().stream().collect(HashMap::new,
            (m, v) -> v.getValue().forEach(k -> m.put(k, v.getKey())), Map::putAll);

        System.out.println(invertMap);// It returned {Apple=Fruit, Cat=Animal, Orange=Fruit, Dog=Animal}

    }

}

阅读 Stream.collect(Supplier 供应商、BiConsumer、BiConsumer 组合器) 了解更多信息。


0
投票

你试试这个方法

Map <String, String> updatedMap = new HashMap<>();
oldMap.keySet()
      .forEach(i -> oldMap.get(i)
                          .forEach(k -> updatedMap.put(k, i)));

0
投票
Map<String, String> outputMap = inputMap.entrySet().stream()
        .flatMap(e -> e.getValue().stream().map(v -> Map.entry(e.getKey(), v)))
        .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));

逐步分解

  1. 将地图转换为条目流。
    // Stream<Map.Entry<String, List<String>>>
    inputMap.entrySet().stream()
    
  2. 将值列表中的每个条目拆分为单独的项目。
    // Stream<Map.Entry<String, String>>
    .flatMap(e -> e.getValue().stream().map(v -> Map.entry(e.getKey(), v)))
    
  3. 将条目转换为新映射,其中键等于之前的值,值也等于之前的键。
    // Map<String, String>
    .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
    
© www.soinside.com 2019 - 2024. All rights reserved.