Java Stream 按 02 个字段分组并按 2 个 BigDecimal 字段的总和聚合

标签 java java-8 java-stream

需要有关使用 groupingBy 的 Stream 案例的帮助
根据不同的分组,我希望能够按 2 个不同的字段进行分组,并获得其他 BigDecimal 字段的总和。这是我的实体:

    public class Customer {
        private String name;
        private String type;
        private BigDecimal total;
        private BigDecimal balance;

// Setter, getter

}
假设我输入了这个列表:
Customer custa = new Customer("A", "STANDARD", new BigDecimal("1000"), new BigDecimal("1500"));
    Customer custa1 = new Customer("A", "VIP", new BigDecimal("2000"), new BigDecimal("2500"));
    Customer custb = new Customer("B", "STANDARD", new BigDecimal("3000"), new BigDecimal("3500"));
    Customer custc = new Customer("C", "STANDARD", new BigDecimal("4000"), new BigDecimal("4500"));
    Customer custa2 = new Customer("A", "VIP", new BigDecimal("1500"), new BigDecimal("2500"));
    List<Customer> listCust = new ArrayList<>();
    listCust.add(custa);
    listCust.add(custa1);
    listCust.add(custb);
    listCust.add(custc);
    listCust.add(custa2);
结果应该是
[
    {"A", "STANDARD", new BigDecimal("1000"), new BigDecimal("1500")},
    {"A", "VIP", new BigDecimal("3500"), new BigDecimal("5000")},
    {"B", "STANDARD", new BigDecimal("3000"), new BigDecimal("3500")},
    {"C", "STANDARD", new BigDecimal("4000"), new BigDecimal("4500")}
]
我在下面有一个解决方案的开始,但是在添加第二个聚合以总结余额时我阻止了:
listCust.stream()
                .collect(Collectors.groupingBy(Customer::getName
                    , Collectors.groupingBy(Customer::getType
                        , Collectors.reducing(BigDecimal.ZERO,Customer::getTotal,BigDecimal::add)))
                )
                .entrySet()

最佳答案

Collection<Customer> customers = listCust.stream()
                                         .collect(Collectors.toMap(
                                                 customer -> customer.getName() + '-' + customer.getType(),
                                                 Function.identity(), (one, two) -> {
                                                     String name = one.getName();
                                                     String type = one.getType();
                                                     BigDecimal total = one.getTotal().add(two.getTotal());
                                                     BigDecimal balance = one.getBalance().add(two.getBalance());
                                                     return new Customer(name, type, total, balance);
                                                 })).values();

关于Java Stream 按 02 个字段分组并按 2 个 BigDecimal 字段的总和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65094934/

相关文章:

java - 无效的 XML 字符 (Unicode : 0x3) was found in the element content of the document in selenium

Java 8 相对于 HashMap 的性能

java - 使用 java 流将评级列表转换为平均评级列表

java - 按日、周或年对元素流进行分组

java - 如何使用java流按值对Map进行排序?

java - Fork/Join 杀死 sibling /分支

java - 如何使用java中的任何类型的OutputStream实现最高性能?

java - 如何正确添加 JVM 系统属性标志

java - 方法引用中的类型推断

Java - 将多个列表数据组合成一个单独的列列表