akapti:
Je suis en train de faire cette itération en utilisant flux java 8 au lieu de traditionnel boucle.
J'ai une liste d'objets List<Obligation>
et Obligation
est d' avoir List
de l' String
intérieur.
Obligation
contient des champs tels que
f1
et f2
de type String
,
et
f3
de type List<String>
Ce que je veux atteindre est Map<String, List<Obligation>>
telle que, String
utilisé dans la clé de Map
est chaque valeur présente dans l'un List<String>
de l' Obligation
intérieur deList<Obligation>
Voici comment le code regarderait en boucle traditionnelle pour:
// newly initialized Map
Map<String, List<Obligation>> map = new LinkedHashMap<String, List<Obligation>>();
// assume the list is populated
List<Obligation> obligations = someMethod();
for(Obligation obligation : obligations) {
for(String license : obligation.getLicenseIDs()) {
if(map.containsKey(license)) {
map.get(license).add(obligation);
} else {
List<Obligation> list = new ArrayList<Obligation>();
list.add(obligation);
map.put(license, list);
}
}
}
Ils étaient les suivants:
Utilisez flatMap
pour créer un flux de paires de Obligation
et les ID de licence, puis utiliser groupingBy
pour les recueillir par ID de licence.
Map<String, List<Obligation>> map =
obligations.stream() // Stream<Obligation>
.flatMap(o -> o.getLicenseIDs()
.stream()
.map(id -> new SimpleEntry<>(o,id))) // Stream<Map.Entry<Obligation,String>>
.collect(Collectors.groupingBy(Map.Entry::getValue,
Collectors.mapping(Map.Entry::getKey,
Collectors.toList())));