Java8-GroupBy实现集合的分组

Java8的groupBy实现集合的快速分组,简化操作,让代码可以更简洁。

groupBy实现集合的分组

场景:

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

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

e.g. 按照skuId分组

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

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

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

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

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//静态内部类
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

1
2
3
4
5
6
Map<String, Map<Integer, List<Person>>> map = people
.collect(Collectors.groupingBy(Person::getName,
Collectors.groupingBy(Person::getAge));

//调用
map.get("Fred").get(18);

本文标题:Java8-GroupBy实现集合的分组

文章作者:郑上进

本文链接:http://blog.zjc123.cn/2019/04/05/Java8-GroupByimplementsgroupingofcollections/

许可协议:转载请保留原文链接及作者姓名。

-------------本文结束感谢您的阅读-------------