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方法可以做到这一点?
我认为你很接近,你需要将这些条目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()) ));
好吧,如果你不想创建那些SimpleEntry
实例的额外开销,你可以做一些不同的事情:
Map> result = new HashMap<>(); initialMap.forEach((key, values) -> { values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key)); });