Wondercease

浙ICP备2022017321号

Collectors.groupingBy(分组)的使用

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)));

发表评论

您的电子邮箱地址不会被公开。