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

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

很明显如何将Map转换为Map<V, List>

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

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

我认为你很接近,你需要将这些条目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> result = new HashMap<>(); initialMap.forEach((key, values) -> { values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key)); });