Eu preciso converter Map<K, List<V>>
para Map<V, List<K>>
. Eu estive lutando com essa questão há algum tempo.
É óbvio como fazer a conversão Map<K, V>
para Map<V, List<K>>
:
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, toList())
)
Mas eu não posso encontrar resolver um problema inicial. Existe alguma maneira fácil de pronto-a-java-8 para fazê-lo?
Eu acho que você estava perto, você teria que flatMap
essas entradas para um Stream
e recolher de lá. Eu usei o já presente SimpleEntry
, mas você pode usar um Pair
de algum tipo também.
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())
));
Bem, se você não quiser criar a sobrecarga extra desses SimpleEntry
casos, você poderia fazê-lo um pouco diferente:
Map<Integer, List<String>> result = new HashMap<>();
initialMap.forEach((key, values) -> {
values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
});
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras