使用Java 8流反转Map &lt;String,List< String>&gt;

ztmd8pv5  于 2024-01-05  发布在  Java
关注(0)|答案(3)|浏览(193)

我需要使用Java 8将<String, List<String>>Map为Map<String,String>,并假设值是唯一的。例如,
输入Map-

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

字符串
输出Map

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

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

odopli94

odopli941#

这样做:

  1. public class InverterMap {
  2. public static void main(String[] args) {
  3. Map<String, List<String>> mp = new HashMap<String, List<String>>();
  4. mp.put("Fruit", Arrays.asList("Apple", "Orange"));
  5. mp.put("Animal", Arrays.asList("Dog", "Cat"));
  6. System.out.println(mp); // It returned {Fruit=[Apple, Orange], Animal=[Dog, Cat]}
  7. Map<String, String> invertMap = mp.entrySet().stream().collect(HashMap::new,
  8. (m, v) -> v.getValue().forEach(k -> m.put(k, v.getKey())), Map::putAll);
  9. System.out.println(invertMap);// It returned {Apple=Fruit, Cat=Animal, Orange=Fruit, Dog=Animal}
  10. }
  11. }

字符串
阅读Stream.collect(Supplier supplier,BiConsumer,BiConsumer combiner)了解更多信息。

展开查看全部
vxbzzdmp

vxbzzdmp2#

你可以试试这样

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

字符串

sd2nnvve

sd2nnvve3#

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

字符串

分步分解

1.将Map转换为条目流。

  1. // Stream<Map.Entry<String, List<String>>>
  2. inputMap.entrySet().stream()

1.将每个条目拆分为值列表中每个项目的单独项目。

  1. // Stream<Map.Entry<String, String>>
  2. .flatMap(e -> e.getValue().stream().map(v -> Map.entry(e.getKey(), v)))

1.将条目转换为新的Map,其中键等于先前的值,值等于先前的键。

  1. // Map<String, String>
  2. .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
展开查看全部

相关问题