使用Java Stream API拆分字符串并累加ORIGINAL_PAYMODE对应数值的实现方案
解决Java Stream API累加ORIGINAL_PAYMODE数值的问题
我来帮你搞定这个累加需求,你的现有代码已经迈出了第一步——筛选出了包含目标关键字的片段,只需要再做几步调整就能实现数值求和。下面是完善后的代码,同时我会逐行解释关键改动:
import java.util.regex.Pattern; import java.math.BigDecimal; import java.math.RoundingMode; public class PaymodeSum { public static void main(String[] args) { String reftype = "ORIGINAL_PAYMODE:90.23,VOUCHRE:30.10,ORIGINAL_PAYMODE:80.30,VOUCHRE:33.10"; Pattern COMMA = Pattern.compile(","); // 累加ORIGINAL_PAYMODE对应的数值 BigDecimal total = COMMA.splitAsStream(reftype) .filter(item -> item.contains("ORIGINAL_PAYMODE")) .map(item -> item.split(":")) // 把每个片段拆成键值对数组,比如["ORIGINAL_PAYMODE", "90.23"] .map(parts -> new BigDecimal(parts[1])) // 将数值字符串转为BigDecimal,避免浮点精度丢失 .reduce(BigDecimal.ZERO, BigDecimal::add); // 从0开始累加所有数值 // 保留两位小数输出,和示例预期结果格式一致 System.out.println(total.setScale(2, RoundingMode.HALF_UP)); } }
关键改动说明:
- 替换
map(String::trim)为拆分逻辑:通过split(":")把筛选后的字符串拆成键和值的数组,这样就能提取出后面的数值部分。 - 用
BigDecimal处理数值:金额类计算推荐用BigDecimal,它能避免Double类型的精度丢失问题(比如经典的0.1+0.2≠0.3问题),结果更准确。 - 使用
reduce完成累加:reduce(BigDecimal.ZERO, BigDecimal::add)会从初始值0开始,依次把每个数值加进去,最终得到总和。 - 格式化输出:
setScale(2, RoundingMode.HALF_UP)确保结果保留两位小数,和示例中的170.53完全匹配。
如果场景允许用Double(不推荐金额场景),也可以简化成下面的写法:
double total = COMMA.splitAsStream(reftype) .filter(item -> item.contains("ORIGINAL_PAYMODE")) .map(item -> item.split(":")[1]) .mapToDouble(Double::parseDouble) .sum(); // 格式化保留两位小数 System.out.printf("%.2f%n", total);
运行代码后就能得到预期的170.53结果啦~
内容的提问来源于stack exchange,提问作者jsp
相关产品推荐
相关产品推荐

