Collectors.groupingBy配合Stream流使用,可以对集合中一个或多个属性进行分组,分组后还可以做聚合运算。
首先把数据放入集合
List<Product> prodList = List.of(prod1, prod2, prod3, prod4, prod5, prod6);
按照类别分组
Map<String, List<Product>> map1 = prodList.stream().collect(Collectors.groupingBy(Product::getCategory));
for(Map.Entry<String,List<Product>>entry:entries1){
System.out.println(entry);
}
啤酒=[Product{id=4, num=3, price=10, name=’青岛啤酒’, category=’啤酒’}, Product{id=5, num=10, price=15, name=’百威啤酒’, category=’啤酒’}, Product{id=5, num=7, price=25, name=’百威啤酒’, category=’啤酒’}]
按照多个属性拼接分组
Map<String,List<Product>>map2=prodList.stream()
.collect(Collectors.groupingBy(item->item.getCategory()+”_”+item.getName()));
Set<Map.Entry<String,List<Product>>>entries2=map2.entrySet();
for(Map.Entry<String,List<Product>>entry:entries2){
System.out.println(entry);
}
零食_月饼=[Product{id=3, num=3, price=30, name=’月饼’, category=’零食’}]
根据不同条件分组
Map<String,List<Product>>map3=prodList.stream().collect(Collectors.groupingBy(item->{
if(item.getNum()>3){
return”num大于3″;
}elseif(item.getNum()<3){
return”num小于3″;
}else{
return”num等于3″;
}
}));
Set<Map.Entry<String,List<Product>>>entries3=map3.entrySet();
for(Map.Entry<String,List<Product>>entry:entries3){
System.out.println(entry);
}
多级分组
这里先按照类别分组,再按照num分组
Map<String,Map<String,List<Product>>>map4=prodList.stream()
.collect(Collectors.groupingBy(Product::getCategory,Collectors.groupingBy(item->{
if(item.getNum()>=8){
return”num大于等于8″;
}else{
return”num小于8″;
}
})));
Set<Map.Entry<String,Map<String,List<Product>>>>entries4=map4.entrySet();
for(Map.Entry<String,Map<String,List<Product>>>entry:entries4){
System.out.println(entry);
}
啤酒={num小于8=[Product{id=4,num=3,price=10,name=’青岛啤酒’,category=’啤酒’},Product{id=5,num=7,price=25,name=’百威啤酒’,category=’啤酒’}],num大于等于8=[Product{id=5,num=10,price=15,name=’百威啤酒’,category=’啤酒’}]}
分组后再聚合求总数
Map<String,Long>map5=prodList.stream()
.collect(Collectors.groupingBy(Product::getCategory,Collectors.counting()));
Set<String>strings5=map5.keySet();
for(String s:strings5){
System.out.println(s+”—“+”总数:”+map5.get(s));
}
分组后再做相加运算
这里先按照类别分组,再聚合运算(把num相加)
Map<String,Integer>map6=prodList.stream()
.collect(Collectors.groupingBy(Product::getCategory,Collectors.summingInt(Product::getNum)));