一、概述
有这样一个需求,在一个list集合中的对象有相同的name,我需要把相同name的对象进行汇总计算。使用java stream来实现这个需求,这里做一个记录,希望对有需求的同学提供帮助
一、根据指定字段进行分组
一、先准备好给前端要封装返回的实体类
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;
}
}
二、准备好要筛选的数据,我这边是调取的第三方系统做的集成,各位小伙伴一般都是查询数据库
JSONObject jsonObject = JSON.parseObject(sync);
JSONObject data = jsonObject.getJSONObject("data");
List<ColthType> records = data.getList("records", ColthType.class);
三、进行筛选分组并统计
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());
四、最终结果