代码之家  ›  专栏  ›  技术社区  ›  Taras Velykyy

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

  •  6
  • Taras Velykyy  · 技术社区  · 6 年前

    Map<K, List<V>> Map<V, List<K>> .

    Map<K, V> :

    .collect(Collectors.groupingBy(
         Map.Entry::getKey, 
         Collectors.mapping(Map.Entry::getValue, toList())
    )
    

    但我找不到解决最初问题的办法。有什么简单易用的java-8方法吗?

    1 回复  |  直到 6 年前
        1
  •  12
  •   Sorter    6 年前

    我觉得你很亲近,你需要 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())
             ));
    

    好吧,如果你不想制造额外的开销 实例,您可以做一些不同的事情:

        Map<Integer, List<String>> result = new HashMap<>();
    
        initialMap.forEach((key, values) -> {
            values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
        });