我需要将 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方法来解决它?
我需要将 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));
});
SimplyEntry
... +1 - EranMap<K,Set<V>>
。(还有缩进。):-) https://github.com/stuart-marks/LambdaHOLv2 - Stuart Marks