需要有关使用 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/