详解Java8的groupBy实现集合的分组

时间:2021-05-19

场景:

Java8的groupBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map

1.对集合按照单个属性分组

e.g. 按照skuId分组

Map<String, List<EntryDeliveryDetailywk>> detailsMap01 = dtos1.stream().collect(Collectors.groupingBy(EntryDeliveryDetailywk::getskuId));

2对集合按照多个属性分组

solution 1 多个属性拼接出一个组合属性

将多个字段拼接成一个新字段,在使用Java8的groupBy进行分组

Map<String, List<EntryDeliveryDetailywk>> detailmap = details.stream().collect(Collectors.groupingBy(d -> fetchGroupKey(d) ));private String fetchGroupKey(EntryDeliveryDetailywk detail){ return detail.getSkuId().toString() + detail.getItemsName() + detail.getWarehouseId().toString() + detail.getSupplierId().toString(); }

solution 2 造静态内部类

在集合元素类里构造静态内部类(成员变量即分组的对应多个属性)

e.g.

//静态内部类class Person { public static class NameAge { public NameAge(String name, int age) { ... } // 注意 重写方法 must implement equals and hash function } public NameAge getNameAge() { return new NameAge(name, age); }}//分组Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));

solution 3 嵌套调用Java8 groupby

注意得到也是嵌套map

Map<String, Map<Integer, List<Person>>> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge));//调用map.get("Fred").get(18);

参考
https://stackoverflow.com/questions/28342814/group-by-multiple-field-names-in-java-8

到此这篇关于详解Java8的groupBy实现集合的分组的文章就介绍到这了,更多相关Java8 groupBy集合分组内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章