Inverser une carte en utilisant les flux en java 8

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 flatMapcomme:

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 SimpleEntryvous pouvez stocker chaque élément de Setcomme la clé de l' entrée et la clé de la carte comme la valeur d'une entrée

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=188221&siteId=1
conseillé
Classement