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
相关产品推荐
相关产品推荐

