在Java8中使用流反转映射

在Java8中使用流反转映射,java,java-8,mapping,java-stream,reverse,Java,Java 8,Mapping,Java Stream,Reverse,我有一张地图,需要反转。这将是一个数据示例: ("AA", ("AA01", "AA02", "AA03") ("BB", ("AA01", "BB01", "BB02") 我想要得到的是一个反向关系的映射,如下所示: ("AA01", ("AA", "BB")) ("AA02",("AA")) ("AA03",("AA")) ("BB01",("BB")) ("BB02",("BB")) 我能够做到,但使用foreach: private Map<String, Set<Str

我有一张
地图
,需要反转。这将是一个数据示例:

("AA", ("AA01", "AA02", "AA03")
("BB", ("AA01", "BB01", "BB02")
我想要得到的是一个反向关系的
映射
,如下所示:

("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;
}
私有映射GetInversionRelationship(映射映射){
映射结果=新的HashMap();
mappings.entrySet().stream().forEach(记录->{
String key=record.getKey();
Set itemSet=record.getValue();
itemSet.forEach(项目->{
Set value=(result.containsKey(item))?result.remove(item):new HashSet();
值。添加(键);
结果。放置(项目、值);
});
});
返回结果;
}

使用Java 8 streams API有更好的方法吗?

您可以使用
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())));
Map invertedMap=Map.entrySet().stream()
.flatMap(entry->entry.getValue().stream())
.map(v->newAbstractMap.SimpleEntry(v,entry.getKey()))
.collect(groupby(Map.Entry::getKey,mapping(Map.Entry::getValue,toSet()));

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

非常感谢!!!这让我得到了与我的解决方案完全相同的结果,但这一个要好得多!!!