Java 8将Map <Integer,List <String >>转换为Map <String,List <Integer >>

ism*_*999 2 java lambda java-8

我有一个Map是一个值列表的映射,但我需要反转它以便

Map<Integer, List<String>> 
Run Code Online (Sandbox Code Playgroud)

Map<String, List<Integer>>
Run Code Online (Sandbox Code Playgroud)

比如我有

1 -> { A, B, C }
2 -> { B }
3 -> { A, C }
Run Code Online (Sandbox Code Playgroud)

而且我想看

A -> { 1, 3 }
B -> { 1, 2 }
C -> { 1, 3 }
Run Code Online (Sandbox Code Playgroud)

在Java 8中有没有更简单的方法来执行此操作,而不是迭代遍历映射条目并创建一个不存在的集合条目,并添加到列表等?我一直认为这很明显,但我无法解决这个问题.

提前致谢

Lou*_*man 9

未经测试,但您可以这样做:

mapIntToStrings.entrySet().stream()
   .flatMap(entryIntToStrings -> entryIntToStrings.getValue().stream()
       .map(str -> new AbstractMap.SimpleEntry<>(entryIntToStrings.getKey(), str)))
   .collect(groupingBy(Map.Entry::getValue, mapping(Map.Entry::getKey, toList())))
Run Code Online (Sandbox Code Playgroud)