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

Java 8中使用BigDecimal实现按产品名称并行分组求和

Java 8 按产品名称分组并求和amount的解决方案

没问题,这事儿用Java 8的Stream API就能轻松搞定,我给你一步步拆解实现步骤:

1. 先定义Product实体类

首先你需要一个对应产品数据的实体类,把示例里的属性都包含进去——注意示例里的amount是字符串类型,所以我们先按String来定义,后续处理的时候再转成数值:

public class Product {
    private String name;
    private String amount;
    private String description;
    private String number;

    // 构造方法
    public Product(String name, String amount, String description, String number) {
        this.name = name;
        this.amount = amount;
        this.description = description;
        this.number = number;
    }

    // Getter方法(必须要有,Stream操作需要获取属性)
    public String getName() { return name; }
    public String getAmount() { return amount; }
    public String getDescription() { return description; }
    public String getNumber() { return number; }
}

2. 核心分组求和逻辑

接下来就是关键的分组求和操作:用Stream.collect()结合Collectors.groupingBy()(按名称分组)和Collectors.summingDouble()(对amount求和)。这里要注意把字符串类型的amount转成Double类型再计算:

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ProductSumExample {
    public static void main(String[] args) {
        // 模拟你的产品列表
        List<Product> productList = List.of(
            new Product("Product A", "40.00", "Info1", "65"),
            new Product("Product A", "50.00", "Info2", "67"),
            new Product("Product A", "100.00", "Info3", "69"),
            new Product("Product B", "30.00", "InfoX", "70")
        );

        // 按名称分组,求和amount
        Map<String, Double> nameToTotalAmount = productList.stream()
            .collect(Collectors.groupingBy(
                Product::getName, // 分组键:产品名称
                Collectors.summingDouble(product -> Double.parseDouble(product.getAmount())) // 求和逻辑:转成Double后累加
            ));

        // 输出结果
        nameToTotalAmount.forEach((name, total) -> 
            System.out.printf("产品:%s,总金额:%.2f%n", name, total)
        );
    }
}

运行这段代码后,输出会是:

产品:Product A,总金额:190.00
产品:Product B,总金额:30.00

3. 额外注意事项

  • 如果你的amount字符串可能包含非数字格式(比如千分位逗号1,000.00),记得先做格式处理,比如用NumberFormat解析,避免NumberFormatException。
  • 如果你需要返回的结果不是Map<String, Double>,而是包含产品名称、总金额和其他属性的自定义对象,可以用Collectors.toMap()或者自定义Collector来实现,比如保留第一个产品的描述和编号,同时叠加金额。

内容的提问来源于stack exchange,提问作者Padmini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:47:41