Quiero usar corrientes en java para agrupar larga lista de objetos basados en múltiples campos. Esto dará lugar a un mapa de mapa de mapa de mapa de mapa de .... del mapa de las listas.
¿Cómo puedo extraer solamente las listas de esa corriente compleja?
Este es un código de ejemplo para la demostración (lista de cadenas, en busca de grupos con la misma longitud y la primera letra). No estoy interesado en las teclas, por si resulta entidades agrupadas.
List<String> strings = ImmutableList.of("A", "AA", "AAA", "B", "BB", "BBB", "C", "CC", "CCC", "ABA", "BAB", "CAC");
Map<Character, Map<Integer, List<String>>> collect = strings.stream().collect(
groupingBy(s -> s.charAt(0),
groupingBy(String::length)
)
);
Esto producirá siguiente resultado
My Map =
{
A =
{
1 = [A]
2 = [AA]
3 = [AAA, ABA]
}
B =
{
1 = [B]
2 = [BB]
3 = [BBB, BAB]
}
C =
{
1 = [C]
2 = [CC]
3 = [CCC, CAC]
}
}
Lo que me interesa en realidad es sólo listas de los resultados anteriores y quiero hacerlo idealmente como parte de la operación GroupBy. Sé que puede hacerse, por ejemplo haciendo un bucle en la estructura de los mapas resultantes. Pero hay una manera de lograr que el uso de corrientes?
[
[A],
[AA],
[AAA, ABA],
[B],
[BB],
[BBB, BAB],
[C],
[CC],
[CCC, CAC]
]
En lugar de crear grupos anidados mediante el uso en cascada Collectors.groupingBy
, se debe agrupar por una clave compuesta:
Map<List<Object>, List<String>> map = strings.stream()
.collect(Collectors.groupingBy(s -> Arrays.asList(s.charAt(0), s.length())));
Luego, basta con agarrar los valores de mapa:
List<List<String>> result = new ArrayList<>(map.values());
Si se encuentra en Java 9+, es posible que desee cambiar de Arrays.asList
a List.of
crear las claves compuestas.
Este enfoque funciona muy bien para su caso porque usted indicó que no estaban interesados en mantener las llaves, y debido a que la List
aplicación devuelto por tanto Arrays.asList
y List.of
están bien definidos en términos de sus equals
y hashCode
métodos, es decir, que puede ser utilizado con seguridad como claves en cualquier Map
.