List之stream统计某个字段的个数转Map(key:字段名 value: 数量),List转map之以某个字段为key,找出该字段对应的List
在sql中我们统计时免不了使用group by,count, count distinct;
stream一定程度上就是sql的变身!方便使用者处理数据!
在实际业务中,免不了要统计满足某种条件下的商品销售的数目、如,查询某个店铺商品的销售数据:
/**
* 统计某个店铺或者所有店铺商品销售数量 goodsId :long
* 关键: Collectors.groupingBy(GoodsVO::getGoodsId, Collectors.counting())
* @param req
* @return
*/
public Map<String, Long> statisticRecipeCookTask(QueryGoodsCountReq req) {
Map<String, Long> map;
List<GoodsVO> list = cookTaskDao.findAll(getGoodsStatisticSpecification(req));
if (StringUtils.isEmpty(req.getStoreId())) {
map = list.stream().collect(Collectors.groupingBy(GoodsVO::getGoodsId, Collectors.counting()));
} else {
map = list.stream().filter(r -> req.getStoreId().equals(r.getStoreId())).collect(Collectors.groupingBy(GoodsVO::getGoodsId, Collectors.counting()));
}
return map;
}
List转map之以某个字段为key,找出该字段对应的List
Map<Long, List<ProductEventsParamsVO>> refId2ProductEventsParamsVOS = productEventsParamsVOS.stream().collect(Collectors.groupingBy(ProductEventsParamsVO::getRefId));
单个属性的数组统计每个元素个数
List<Integer> scores = Arrays.asList(320, 321, 321, 300, 288, 288, 287);
Map<Integer, Long> map = scores.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()));