It\'s easy to convert List
into Map
. For example:
public Map> ge
You could have the following:
public Map> getMap(List strings) {
return strings.stream().collect(
Collectors.groupingBy(String::length, HashMap::new, Collectors.toCollection(ArrayList::new))
);
}
The collector groupingBy(classifier, mapFactory, downstream) can be used to specify which type of map is wanted, by passing it a supplier of the wanted map for the mapFactory
. Then, the downstream collector, which is used to collect elements grouped to the same key, is toCollection(collectionFactory), which enables to collect into a collection obtained from the given supplier.
This makes sure that the map returned is a HashMap
and that the lists, in each value, are ArrayList
. Note that if you want to return specific implementations of map and collection, then you most likely want the method to return those specific types as well, so you can use their properties.
If you only want to specify a collection supplier, and keep groupingBy
default map, you can just omit the supplier in the code above and use the two arguments overload:
public Map> getMap(List strings) {
return strings.stream().collect(
Collectors.groupingBy(String::length, Collectors.toCollection(ArrayList::new))
);
}
As a side-note, you could have a generic method for that:
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))
);
}
The advantage with this declaration is that you can now use it to have specific HashMap
of ArrayList
s as result, or LinkedHashMap
of LinkedLists
s, if the caller wishes it:
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);
but, at that point, it may be simpler to directly use the groupingBy
in the code...