0
点赞
收藏
分享

微信扫一扫

java集合的组内计算

在最近项目中需要对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);

java集合的组内计算_List

举报

相关推荐

0 条评论