Java 流和分组:将对象放入多个组

Java stream and groupping: put object to multiple groups

我不认为它叫做 "groupping" 但我需要实现以下目标: 我有 class

class Person {
   String name;
   Set<String> groups;
}

我有几个人:

  1. 父亲 => {"Worker", "Men"}
  2. 母亲 => {"Woman"}
  3. 儿子 => {"Student","Men"}
  4. 女儿 => {"Student","Woman"}

因此,每个人都可以属于多个类别。 我想获得以下映射:

"Worker" => {Father}
"Men" => {Father, Son}
"Student" => {Son, Daughter}
"Woman" => {Mother, Daughter}

现在我可以通过手动遍历每个人并将他们放到 Map<String,List<Person>>

来做到这一点

我正在尝试使用流(或 StreamEx)oneliner 找到更优雅的方法,例如:

List<Persons> family= ...;
Map<String,List<Person>> groupped = family.stream().groupByMultipleAttributes(Person::getGroups)

您可以生成所有关联的组和 Person 对,然后用 groupingBy 将它们收集到 Map:

Map<String,List<Person>> groups =
    family.stream()
          .flatMap(p -> p.getGroups()
                         .stream()
                         .map(g -> new SimpleEntry<>(g,p)))
          .collect(Collectors.groupingBy(Map.Entry::getKey,
                                         Collectors.mapping(Map.Entry::getValue,
                                                            Collectors.toList())));