Java8stream分组求和操作
场景:
数据库查到⼀批数据,数据⾥⾯有不同类型的统计数据,会有typeKey[类型,string],还有typeValue[统计的数值,double]
要求把数据分类型统计求和,然后按列表返回,例如有⼀个列表的学⽣数据,要求按年级分组统计出⼀个列表,列表模型⾥name[年级],value[数量],其实就是MySql的分组求和,这⾥⽤Java8的函数写。
源数据模型
@Setter
@Getter
public class StatisVO{
/**
* 维度项值
*/
private String typeKey;
/**
* 维度项统计值
*/
private String typeValue;
}
结果模型
@Setter
@Getter
public class ResultVO<T> {
private String name;
private T value;
java streampublic ResultVO(String name, T value) {
this.name = name;
this.value = value;
}
}
stream写法
public static List<ResultVO<Double>> sumStatisList(List<StatisVO>statisList,Boolean sort){    List<ResultVO<Double>> result = new ArrayList<>();
statisList.stream()
//根据typeKey分组得到Map<String,List<StatisVO>>
.upingBy(BaseStatisEntity::getTypeKey))
//map key遍历
.entrySet().stream().forEach(entry -> {
//AtomicDouble可以操作累加
AtomicDouble sum = new AtomicDouble(0);
//List<StatisVO> 遍历统计typeValue
//这个⽅法可以取值并累加
sum.addAndGet(Double.TypeValue()));
});
//加⼊结果list
result.add(new StatisVO<Double>(Key(), sum.doubleValue()));
});
if (sort) {
//倒序操作
return result.stream()
.sorted(Comparatorparing(StatisVO<Double>::getValue).reversed())
.List());
} else {
return result;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。