【问题标题】:Java stream and groupping: put object to multiple groups [duplicate]Java流和分组:将对象放入多个组[重复]
【发布时间】:2020-01-29 13:45:07
【问题描述】:

我不认为它被称为“分组”,但我需要实现以下目标: 我有课

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

我有一些人:

  1. 父亲 => {"工人", "男人"}
  2. 母亲 => {“女人”}
  3. 儿子 => {"学生","男人"}
  4. 女儿 => {"学生","女人"}

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

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

现在我可以通过手动迭代每个人并将他们发送到Map&lt;String,List&lt;Person&gt;&gt;来做到这一点

我正在尝试找到一个更优雅的 wat 来使用流(或 StreamEx)oneliner,例如:

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

【问题讨论】:

    标签: java java-stream streamex


    【解决方案1】:

    您可以生成所有关联的组对和Persons,然后用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())));
    

    【讨论】:

    • 感谢您的回复,但是这种来回的“双重映射”看起来不太优雅,IMO :)
    猜你喜欢
    • 2020-02-14
    • 2016-08-05
    • 2017-10-16
    • 1970-01-01
    • 2019-01-06
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多