You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 12:42:40