使用java 8中的流来反转地图[重复]

问题描述 投票:4回答:1

这个问题在这里已有答案:

我有一个需要扭转的Map<String, Set<String>>。这将是一个数据示例:

("AA", ("AA01", "AA02", "AA03")
("BB", ("AA01", "BB01", "BB02")

我想要获得的是反向关系的Map<String, Set<String>>,如下所示:

("AA01", ("AA", "BB"))
("AA02",("AA"))
("AA03",("AA"))
("BB01",("BB"))
("BB02",("BB"))

我能够做到,但使用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;
}

有没有更好的方法来使用Java 8流API?

java java-8 mapping java-stream reverse
1个回答
3
投票

您可以像以下一样使用flatMap

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())));

使用SimpleEntry,你可以将Set中的每个元素存储为条目的键,并将map的键作为条目的值存储

© www.soinside.com 2019 - 2024. All rights reserved.