我需要将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方法吗?
答案 0 :(得分: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())
));
好吧,如果您不想创建这些SimpleEntry
实例的额外开销,则可以做些不同:
Map<Integer, List<String>> result = new HashMap<>();
initialMap.forEach((key, values) -> {
values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
});