教你用java stream对集合中的对象按指定字段进行分组并统计
作者:听忆.
这篇文章主要给大家介绍了关于用java stream对集合中的对象按指定字段进行分组并统计的相关资料,本文主要介绍了如何利用Java的Stream流来实现在list集合中,对具有相同name属性的对象进行汇总计算的需求,需要的朋友可以参考下
一、概述
有这样一个需求,在一个list集合中的对象有相同的name,我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求,这里做一个记录,希望对有需求的同学提供帮助
二、根据指定字段进行分组
1、先准备好给前端要封装返回的实体类
package com.tingyi.pojo; import lombok.*; @Data @AllArgsConstructor @NoArgsConstructor public class ColthTypeVo { //所指定的字段 private String name; //统计的数量 private Integer total; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getTotal() { return total; } public void setTotal(Integer total) { this.total = total; } }
2、准备好要筛选的数据,我这边是调取的第三方系统做的集成,各位小伙伴一般都是查询数据库
JSONObject jsonObject = JSON.parseObject(sync); JSONObject data = jsonObject.getJSONObject("data"); List<ColthType> records = data.getList("records", ColthType.class);
3、进行筛选分组并统计
List<ColthTypeVo> collect = records.stream() //这边建议将这个字段过滤一下 不能为空 .filter(l->!StringUtils.isEmpty(l.getCarTypeName())) //如果为空的话 这里分组会报错 key is null .collect(Collectors.groupingBy(ColthType::getCarTypeName)) .entrySet() .stream() .map(c -> { String key = c.getKey(); List<ColthType> value = c.getValue(); Integer size = value.size(); ColthTypeVo colthTypeVo = new ColthTypeVo(); colthTypeVo.setName(key); colthTypeVo.setTotal(size); return colthTypeVo; //小伙伴要注意 这里不可以直接 new ColthTypeVo().setName(key); 可能会因为返回值为void爆红 void不支持链式调用 }).collect(Collectors.toList());
4、最终结果
总结
到此这篇关于用java stream对集合中的对象按指定字段进行分组并统计的文章就介绍到这了,更多相关java stream按指定字段分组统计内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!