Javaの8ストリームAPI:複数のグループに同じオブジェクトを持っているGroupingByを使用する方法?

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=331598&siteId=1