场景:
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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)