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中文网其他相关文章!