1Z10:
私は、次のクラスがあります。
public class A{
public List<String> groups;
}
そして私は、A構築しようとしている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);
});
});