在Java 8中使用流反向映射 [英] Reverse a map using streams in java 8
本文介绍了在Java 8中使用流反向映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个需要反转的 Map< String,Set< String>>
.这将是一个数据示例:
I have a Map<String, Set<String>>
that I need to reverse. This would be an example of data:
("AA", ("AA01", "AA02", "AA03")
("BB", ("AA01", "BB01", "BB02")
我想要获得的是反向关系的 Map< String,Set< String>>
,类似这样:
What I want to obtain is a Map<String, Set<String>>
of the reverse relationship, something like this:
("AA01", ("AA", "BB"))
("AA02",("AA"))
("AA03",("AA"))
("BB01",("BB"))
("BB02",("BB"))
我能够做到,但是使用了foreach:
I was able to do it, but using 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是否有更好的方法?
Is there a better way to do it using 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())));
使用 SimpleEntry
,您可以将 Set
中的每个元素存储为条目的键,并将map的键存储为条目的值
Using SimpleEntry
you can store each element from Set
as an entry's key and map's key as an entry's value
这篇关于在Java 8中使用流反向映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文