akapti:
Eu estou tentando fazer isso iteração usando fluxo de java 8 em vez de tradicional para loop.
Eu tenho uma lista de objetos List<Obligation>
e Obligation
está tendo List
de String
dentro.
Obligation
contém campos como
f1
e f2
do tipo String
,
e
f3
do tipo List<String>
O que eu quero alcançar é Map<String, List<Obligation>>
tal que, String
usado na chave de Map
é cada valor presente em List<String>
de cada um Obligation
dentroList<Obligation>
Isto é como o código ficaria na tradicional para loop:
// 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);
}
}
}
Eles foram:
Use flatMap
para criar um fluxo de pares de Obligation
e IDs de licença e, em seguida, usar groupingBy
a recolhê-los por ID de licença.
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())));