Java 8将Map <k,list <v =“” >>转换为Map <v,list <k =“” >>

时间:2018-08-16 12:59:18

标签: java collections java-8 mapping 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())
)

但是我找不到解决最初的问题的方法。有一些易于使用的Java-8方法吗?

1 个答案:

答案 0 :(得分:11)

我认为您已经接近,您需要将这些条目flatMapStream并从那里收集。我使用了已经存在的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())
         ));

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

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

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