grupo de la secuencia de múltiples teclas

presa:

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]
 ]
Federico Peralta Schaffner:

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.asLista List.ofcrear 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 Listaplicación devuelto por tanto Arrays.asListy List.ofestán bien definidos en términos de sus equalsy hashCodemétodos, es decir, que puede ser utilizado con seguridad como claves en cualquier Map.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=186589&siteId=1
Recomendado
Clasificación