首页 >Java >java教程 >如何使用 Java 8 流按多个字段对数据进行分组?

如何使用 Java 8 流按多个字段对数据进行分组?

DDD
DDD原创
2024-11-26 11:13:09874浏览

How Can I Group Data by Multiple Fields Using Java 8 Streams?

Java 8 中按多个字段分组

按字段名称对对象进行分组时,Java 8 提供了 Collectors.groupingBy() 方法。但是,如果我们需要按多个字段进行分组怎么办?

选项 1:链接收集器

一种方法是链接多个 Collectors.groupingBy() 调用:

Map<String, Map<Integer, List<Person>>> map = people
                .collect(Collectors.groupingBy(Person::getName,
                        Collectors.groupingBy(Person::getAge)));

这将创建一个嵌套地图,其中第一级按名称分组,第二级按年龄分组。要检索名为 Fred 的 18 岁人员列表:

map.get("Fred").get(18);

选项 2:定义分组记录

或者,我们可以创建一个类 (例如,NameAge)表示分组字段:

class NameAge implements Comparable<NameAge> {
    String name;
    int age;
    
    // Constructor, getters, compareTo, etc.
}

然后,按 NameAge 记录分组:

Map<NameAge, List<Person>> map = people
                .collect(Collectors.groupingBy(Person::getNameAge));

检索:

map.get(new NameAge("Fred", 18));

选项 3:使用 Pair 类

如果实现自定义分组记录是不可取的,我们可以利用 Apache Commons 或 Java 的新 java.util.function.Pair 等库中的pair类。例如,使用 Apache Commons:

Map<Pair<String, Integer>, List<Person>> map =
                people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));

检索:

map.get(Pair.of("Fred", 18));

推荐

方法的选择取决于具体要求。 Records 提供了简洁明了的解决方案,但对于更复杂的场景,像 Apache Commons 这样的库可能是首选。

以上是如何使用 Java 8 流按多个字段对数据进行分组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn