在最近项目中需要对java集合的数据进行计算,需要计算各指标的最大值,最小值,平均值,均差,代码如下
1.获取指标数据
// 查询选择的指标数据
List<String> split =null ;
if(ObjectUtil.isNotEmpty(pointIds)){
split = StrUtil.split(pointIds, ",");
}
List<IdxIndexAcqVal> idxIndexVals = indexValMapper.selectList(
new LambdaQueryWrapper<IdxIndexAcqVal>()
.eq(IdxIndexAcqVal::getAcquisitionDate, date)
.in( CollectionUtil.isNotEmpty(split),IdxIndexAcqVal::getIndexId, split)
.orderByDesc(IdxIndexAcqVal::getDataTime)
);
// 对指标进行分类
Map<String, List<IdxIndexAcqVal>> groupedByCode = idxIndexVals.stream().collect(Collectors.groupingBy(IdxIndexAcqVal::getCode));
// 循环对指标进行处理
for (IdxIndexAcquisition idxIndex : idxIndexes) {
String code = idxIndex.getCode();
List<IdxIndexAcqVal> vals = groupedByCode.get(code);
if (CollectionUtil.isEmpty(vals)) {
continue;
}
// 其他代码 ..........
2.计算平均值
BigDecimal avg = vals.stream().map(IdxIndexAcqVal::getValue).reduce(BigDecimal::add)
.orElse(null).divide(new BigDecimal(vals.size()), 2, BigDecimal.ROUND_HALF_UP);
3.计算最大最小
BigDecimal max = vals.stream().map(IdxIndexAcqVal::getValue).max(BigDecimal::compareTo).orElse(null);
BigDecimal min = vals.stream().map(IdxIndexAcqVal::getValue).min(BigDecimal::compareTo).orElse(null);
4.计算均差
BigDecimal diff = vals.stream().map(obj -> obj.getValue().subtract(avg).abs())
.reduce(BigDecimal.ZERO, BigDecimal::add)
.divide(new BigDecimal(vals.size()), 2, BigDecimal.ROUND_HALF_UP);