user1990218:
J'ai Map<String, Set<String>>
que je dois inverser. Ce serait un exemple de données:
("AA", ("AA01", "AA02", "AA03")
("BB", ("AA01", "BB01", "BB02")
Ce que je veux obtenir est Map<String, Set<String>>
de la relation inverse, quelque chose comme ceci:
("AA01", ("AA", "BB"))
("AA02",("AA"))
("AA03",("AA"))
("BB01",("BB"))
("BB02",("BB"))
J'ai pu le faire, mais en utilisant foreach:
private Map<String, Set<String>> getInverseRelationship(Map<String, Set<String>> mappings) {
Map<String, Set<String>> result = new HashMap<>();
mappings.entrySet().stream().forEach(record -> {
String key = record.getKey();
Set<String> itemSet = record.getValue();
itemSet.forEach(item -> {
Set<String> values = (result.containsKey(item))? result.remove(item) : new HashSet<>();
values.add(key);
result.put(item, values);
});
});
return result;
}
Y at-il une meilleure façon de le faire en utilisant l'API Java 8 flux?
Ruslan:
Vous pouvez utiliser flatMap
comme:
Map<String, Set<String>> invertedMap = map.entrySet().stream()
.flatMap(entry -> entry.getValue().stream()
.map(v -> new AbstractMap.SimpleEntry<>(v, entry.getKey())))
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toSet())));
L' utilisation que SimpleEntry
vous pouvez stocker chaque élément de Set
comme la clé de l' entrée et la clé de la carte comme la valeur d'une entrée