我需要转换 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 方法来做到这一点?
最佳答案
我认为您很接近,您需要将这些条目 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));
});
关于Java 8 将 Map<K, List<V>> 转换为 Map<V, List<K>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51877674/