J'ai List<Map<String, String>>
chaque élément de la liste est une carte par exemple
companyName - IBM
firstName - James
country - USA
...
Je voudrais créer un Map<String, List<String>>
où il mappe companyName à une liste de firstName E.g
IBM -> James, Mark
ATT -> Henry, Robert..
private Map<String,List<String>> groupByCompanyName(List<Map<String, String>> list) {
return list.stream().collect(Collectors.groupingBy(item->item.get("companyName")));
}
mais cela va créer Map<String, List<Map<String, String>>
(mapper comanyName sur une liste de mappes)
comment créer un Map<String, List<String>>
?
Je ne l'ai pas testé, mais quelque chose comme ça devrait marcher:
Map<String, List<String>> namesByCompany
= list.stream()
.collect(Collectors.groupingBy(item->item.get("companyName"),
Collectors.mapping(item->item.get("firstName"), Collectors.toList())));
Vous pouvez utiliser le formulaire:
groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
c’est-à-dire spécifier les valeurs de la carte en aval à prendre en liste. La documentation a un bon exemple pour cela ( ici ).
downstream
étant quelque chose comme - mapping(item->item.get(<name>), toList())
La méthode groupingBy génère une carte dont les valeurs sont des listes. Si vous souhaitez traiter ces listes d'une manière ou d'une autre, fournissez un "collecteur en aval" Dans ce cas, vous ne voulez pas d'une liste comme valeur, vous devez donc fournir un collecteur en aval.
Pour manipuler la carte, vous pouvez utiliser le mappage de méthode statique dans le fichier Collectors:
Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
Collector<? super U, A, R> downstream)
Fondamentalement, il génère un collecteur en appliquant une fonction aux résultats en aval et la transmet à un autre collecteur.
Collectors.mapping(item->item.get("firstName"), Collectors.toList())
Cela retournera un collecteur en aval qui réalisera ce que vous voulez.