Java 8将Map <K,List <V >>转换为Map <V,List <K >>

Tar*_*kyy 6 java mapping collections java-8 java-stream

我需要转换Map<K, List<V>>Map<V, List<K>>.一段时间以来,我一直在努力解决这个问题.

很明显如何转换Map<K, V>Map<V, List<K>>:

.collect(Collectors.groupingBy(
     Map.Entry::getKey, 
     Collectors.mapping(Map.Entry::getValue, toList())
)
Run Code Online (Sandbox Code Playgroud)

但我找不到解决最初的问题.是否有一些易于使用的java-8方法可以做到这一点?

Eug*_*ene 11

我认为你很接近,你需要flatMap那些参赛作品Stream并从那里收集.我已经使用了已经存在的SimpleEntry,但你也可以使用Pair某种类型.

initialMap.entrySet()
          .stream()
          .flatMap(entry -> entry.getValue().stream().map(v -> new SimpleEntry<>(entry.getKey(), v)))
          .collect(Collectors.groupingBy(
               Entry::getValue,
               Collectors.mapping(Entry::getKey, Collectors.toList())
         ));
Run Code Online (Sandbox Code Playgroud)

好吧,如果您不想创建这些SimpleEntry实例的额外开销,您可以做一些不同的事情:

    Map<Integer, List<String>> result = new HashMap<>();

    initialMap.forEach((key, values) -> {
        values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
    });
Run Code Online (Sandbox Code Playgroud)

  • 我只是在写一个答案(首先在我的IDE上尝试),但它没有通过编译.然后你发布了一个看起来和我一样的答案,但是你的答案确实通过了汇编.我无法发现差异,直到我在比较工具中比较它们并发现我发明了一个新类 - "SimplyEntry"...... +1 (2认同)