服务器之家

服务器之家 > 正文

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

时间:2021-08-25 11:11     来源/作者:kris999

场景:

Java8groupBy实现集合的分组,类似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);

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

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

原文链接:https://blog.csdn.net/kris1025/article/details/80714361

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部