Terraza Velykyy:
Necesito convertir Map<K, List<V>>
a Map<V, List<K>>
. He estado luchando con este problema desde hace algún tiempo.
Es obvio cómo hacer la conversión Map<K, V>
a Map<V, List<K>>
:
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, toList())
)
Pero no puedo encontrar resolver un problema inicial. ¿Hay alguna forma fácil de prêt-java-8 para hacerlo?
Eugene:
Creo que estaban cerca, que tendría que flatMap
esas entradas a una Stream
y retirar de allí. He utilizado el ya presente SimpleEntry
, pero se puede utilizar una Pair
de algún tipo también.
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())
));
Bueno, si usted no desea crear la sobrecarga adicional de esos SimpleEntry
casos, usted podría hacerlo un poco diferente:
Map<Integer, List<String>> result = new HashMap<>();
initialMap.forEach((key, values) -> {
values.forEach(value -> result.computeIfAbsent(value, x -> new ArrayList<>()).add(key));
});