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 super V, ? extends K> 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 ArrayList
s como resultado, o LinkedHashMap
de LinkedLists
s, 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.