Saltar al contenido

Cómo convertir Lista en el mapa>, con flujos de Java 8 y listas personalizadas y proveedores de mapas?

Hacemos una verificación profunda cada uno de los enunciados en nuestra página web con el objetivo de enseñarte siempre información con la mayor veracidad y actualizada.

Solución:

Podrías tener lo siguiente:

public Map> getMap(List strings) 
    return strings.stream().collect(
      Collectors.groupingBy(String::length, HashMap::new, Collectors.toCollection(ArrayList::new))
    );

El coleccionista groupingBy(classifier, mapFactory, downstream) se puede utilizar para especificar qué tipo de mapa se desea, pasándole un proveedor del mapa deseado para el mapFactory. Luego, el colector aguas abajo, que se utiliza para recoger elementos agrupados en el mismo keyes toCollection(collectionFactory)que permite recoger en una colección obtenida del proveedor dado.

Esto asegura que el mapa devuelto sea un HashMap y que las listas, en cada valor, son ArrayList. Tenga en cuenta que si desea devolver implementaciones específicas de mapa y colección, lo más probable es que desee que el método también devuelva esos tipos específicos, para que pueda usar sus propiedades.

Si sólo desea especificar un proveedor de recogida y mantener groupingBy mapa predeterminado, puede simplemente omitir el proveedor en el código anterior y usar la sobrecarga de dos argumentos:

public Map> getMap(List strings) 
    return strings.stream().collect(
      Collectors.groupingBy(String::length, Collectors.toCollection(ArrayList::new))
    );


Como nota al margen, podría tener un método genérico para eso:

public , M extends Map> M getMap(List list,
        Function classifier, Supplier mapSupplier, Supplier collectionSupplier) 
    return list.stream().collect(
        Collectors.groupingBy(classifier, mapSupplier, Collectors.toCollection(collectionSupplier))
    );

La ventaja de esta declaración es que ahora puede usarla para tener HashMap de ArrayLists como resultado, o LinkedHashMap de LinkedListss, si la persona que llama lo desea:

HashMap> m = getMap(Arrays.asList("foo", "bar", "toto"),
        String::length, HashMap::new, ArrayList::new);
LinkedHashMap> m2 = getMap(Arrays.asList("foo", "bar", "toto"),
        String::length, LinkedHashMap::new, LinkedList::new);

pero, en ese punto, puede ser más simple usar directamente el groupingBy en el codigo…

Podría usar esta solución, si planea crear un mapa similar a Map>:

Map> ds= requestList.stream().collect(
    Collectors.groupingBy(TagRequest::getProperty_1, HashMap::new, 
    Collectors.mapping(TagRequest::getProperty_2, Collectors.toList()))
);

Si planea crear un mapa similar a Map>puedes utilizar:

Map> ds= requestList.stream().collect(
    Collectors.groupingBy(TagRequest::getProperty_1, HashMap::new, 
    Collectors.mapping(TagRequest::getProperty_2, Collectors.toSet()))
);

Si guardas alguna sospecha y capacidad de progresar nuestro escrito eres capaz de dejar una interpretación y con deseo lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *