我有以下类(class):
public class A{
public List<String> groups;
}
我正在尝试构建一个 Map<String, List<A>>
其中键代表组。
我知道当 A 类属于单个组时该怎么办:
List<A> aList = getAList();
Map<String, List<A>> aByGroupMap = aList.stream().parallel()
.collect(Collectors.groupingBy(a -> a.getGroup()));
但是我怎样才能修改上面的代码,将对象 A 映射到多个组呢?
例如。如果对象a1
怎么办?属于组 ["G", "H", "I"]
对象 a2 属于组 ["H", "I"]
?
最佳答案
你可以尝试这样的事情:
Map<String, List<A>> aByGroupMap = aList.stream()
.flatMap(a -> a.getGroups().stream()
.map(g -> new AbstractMap.SimpleEntry<>(g , a)))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
或者,如果您有一小部分先前已知的组,例如
Set<String> myGroups = Set.of("A","B","C");
你可以这样做:
Map<String,List<A>> map = new HashMap<>();
myGroups.forEach(g -> {
aList.stream().filter(a -> a.getGroups().contains(g)).forEach(a ->{
map.computeIfAbsent(g, s -> new ArrayList<>()).add(a);
});
});
关于Java 8 流 API : how to use GroupingBy to have the same object in multiple groups?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58522482/