Java Spring中对接口返回JSON的指定对象及数组字段求和实现
实现代码
这里提供两种常用实现方案,根据业务场景选择即可:
方案1:使用BigDecimal计算(推荐,适用于金额类场景,无精度丢失)
import java.math.BigDecimal; import java.util.Optional; // 1. 计算ResponA的SumA值 BigDecimal sumA = new BigDecimal(Optional.ofNullable(respon.getBody().ResponA().SumA()).orElse("0")); // 2. 累加Respon B数组所有元素的SumB值 BigDecimal sumBTotal = respon.getBody().ResponB().stream() .map(item -> new BigDecimal(Optional.ofNullable(item.SumB()).orElse("0"))) .reduce(BigDecimal.ZERO, BigDecimal::add); // 3. 累加ResponC数组所有元素的SumC值 BigDecimal sumCTotal = respon.getBody().ResponC().stream() .map(item -> new BigDecimal(Optional.ofNullable(item.SumC()).orElse("0"))) .reduce(BigDecimal.ZERO, BigDecimal::add); // 4. 计算三者总和 BigDecimal total = sumA.add(sumBTotal).add(sumCTotal); // 可根据需要转成其他类型,比如转字符串输出: String totalStr = total.toString();
方案2:使用整型计算(适用于确定所有值为整数且数值无溢出的场景)
// 1. 计算ResponA的SumA值 int sumA = Integer.parseInt(respon.getBody().ResponA().SumA()); // 2. 累加Respon B数组所有元素的SumB值 int sumBTotal = 0; for (var bItem : respon.getBody().ResponB()) { sumBTotal += Integer.parseInt(bItem.SumB()); } // 3. 累加ResponC数组所有元素的SumC值 int sumCTotal = 0; for (var cItem : respon.getBody().ResponC()) { sumCTotal += Integer.parseInt(cItem.SumC()); } // 4. 计算三者总和 int total = sumA + sumBTotal + sumCTotal;
注意事项
- 所有返回的金额字段都是字符串类型,必须先转成数值类型再做累加,否则会变成字符串拼接
- 方案1中加入了Optional判空逻辑,如果业务上确定返回值一定不为空,可以去掉Optional部分简化代码
- 如果数值较大超过int范围,可以把int替换为long类型
内容的提问来源于stack exchange,提问作者lass
相关产品推荐
相关产品推荐

