首页 > Java > java教程 > 如何使用'Collectors.groupingBy()”在 Java 8 中按多个字段对数据进行分组?

如何使用'Collectors.groupingBy()”在 Java 8 中按多个字段对数据进行分组?

Patricia Arquette
发布: 2024-11-24 10:27:11
原创
695 人浏览过

How Can I Group Data by Multiple Fields in Java 8 Using `Collectors.groupingBy()`?

Java 8 中按多个字段分组,超越单字段分组

按单个字段对对象进行分组是数据处理中的常见操作。但是,可能会出现需要按多个字段进行分组的情况。提供的初始代码片段演示了按年龄字段进行分组。本文深入探讨了按同一 POJO 中的多个字段进行分组的选项。

链接收集器

一种简单的方法是链接多个收集器。下面的代码演示了这种技术:

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

通过这种方法,检索名为 Fred 的 18 岁个体的列表:

map.get("Fred").get(18);
登录后复制

定义分组记录

创建一个表示分组的类是另一种方法。这里,用一条记录来表示姓名和年龄的组合:

class Person {
    record NameAge(String name, int age) {}

    public NameAge getNameAge() {
        return new NameAge(name, age);
    }
}
登录后复制

然后可以按如下方式进行分组:

Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));
登录后复制

在分组数据中搜索:

map.get(new NameAge("Fred", 18));
登录后复制

使用框架中的 Pair 类库

像 Apache Commons 这样的库为这种类型的场景提供了pair类。使用pair类,映射的键可以构造为:

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

从映射中检索:

map.get(Pair.of("Fred", 18));
登录后复制

结论

Java 8 的 Collectors.groupingBy() 方法提供了对数据分组的灵活性。本文演示了将分组扩展到单个字段之外的不同方法,包括链接收集器、定义自定义分组记录以及利用框架库中的对类。此外,Java 中的记录可以更轻松地定义分组标准,而无需自定义类。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板