【问题标题】:Java 8 group by and BigDecimalJava 8 group by 和 BigDecimal
【发布时间】:2025-12-11 12:50:01
【问题描述】:

我有一个类似的 Java 类

public class A {
    private int id;
    private BigDecimal amount;
}

我想按 id 与 java 8 几个这样的对象分组:

public class Main {

    public static void main(String[] args) {
        A a1 = new A(1, new BigDecimal("500.36"));
        A a2 = new A(2, new BigDecimal("439.97"));
        A a3 = new A(2, new BigDecimal("49.97"));
        A a4 = new A(2, new BigDecimal("9.97"));

        List<A> postings = new ArrayList<>();
        postings.add(a1);
        postings.add(a2);
        postings.add(a3);
        postings.add(a4);

        List<A> brol = new ArrayList<>();

        System.out.println("-----------------");

        postings.stream()
                .collect(Collectors.groupingBy(A -> A.getId(), Collectors.summingDouble(A->A.getAmount().doubleValue())))
                .forEach((id, sum) -> brol.add(new A(id, BigDecimal.valueOf(sum))));

        brol.forEach(System.out::println);
    }
}

输出是:

1 500.36
2 499.91

这正是我正在寻找的。但是,有Collectors.summingDouble 操作,我知道Double 不适合货币操作。 那么我会遇到这种方法的问题(处理货币操作)还是有办法用 BigDecimal 做到这一点?

【问题讨论】:

  • 请不要在您的问题中回答。按“发布您的答案”单独发布。

标签: java java-8 java-stream bigdecimal


【解决方案1】:

您可以使用reducingBigDecimal 进行求和:

.collect(Collectors.groupingBy(A::getId,              
                               Collectors.reducing(BigDecimal.ZERO, 
                                                   A::getAmount, 
                                                   BigDecimal::add)))

【讨论】:

  • 谢谢,我也在找同样的东西。这是唯一的方法,还是我们可以通过其他方式做同样的事情?