有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java 8 group by和BigDecimal

我有一个Java类,比如

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

我想用java 8按id对以下几个对象进行分组:

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实现它


共 (1) 个答案

  1. # 1 楼答案

    您可以使用reducing来执行与BigDecimal的求和:

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