Tengo esta clase:
class A {
private List<String> keys;
private String otherData;
private int otherDate2;
// getter and setters for each
}
Para esta clase tengo una simple lista llena de algunos datos. List<A> listOfA
. Ahora quiero convertir estos datos a un mapa.Map<String, List<A>>
Actualmente estamos usando un montón de métodos para archivar esto de una manera muy complicada. Creo que podemos resolver con un simple stream()
-operación.
He intentado esto
// first
listOfA.stream()
.collect(Colletors.groupingBy(a -> a.getKeys()))
// produces a Map<String, List<A>>
// second
listOfA.stream()
.flatMap(a -> a.getKeys().stream())
.collect(Colletors.groupingBy(string -> string))
// produces a Map<String, List<String>>
¿Cuál es la manera correcta para esta situación?
Editar: Para que quede claro, yo quiero una Map<String, List<A>>
.
No es necesario corrientes de esto. Es más fácil de esta manera:
Map<String, List<A>> result = new HashMap<>();
listOfA.forEach(a -> a.getKeys().forEach(key ->
result.computeIfAbsent(key, k -> new ArrayList<>()).add(a)));
Este itera listas exterior e interior y llena un Map
uso computeIfAbsent
, lo que crea una lista vacía si todavía no existe un valor de la clave dada, entonces A
casos simplemente se añaden a la lista correspondiente.