【发布时间】:2021-06-13 14:09:03
【问题描述】:
CashBox 类:
public class CashBox {
private long cashBoxId;
private BigDecimal totalAmount;
private long merchantId;
// all-args constructor
}
商家类:
public class Merchant {
private long merchantId;
private BigDecimal totalAmount;
// all-args constructor
}
输入数据:
List<CashBox> cashBoxes = List.of(
new CashBox(1, new BigDecimal(1000), 1),
new CashBox(2, new BigDecimal(2000), 1),
new CashBox(3, new BigDecimal(3000), 2),
new CashBox(4, new BigDecimal(500), 2));
我的任务
计算每个商户的总金额并返回商户列表
我正在尝试使用 Stream API 解决此任务。并写了如下代码:
List<Merchant> merchant = cashBoxes.stream()
.map(merch -> new Merchant(
merch.getMerchantId(),
cashBoxes.stream()
.filter(cashBox -> cashBox.getMerchantId() == merch.getMerchantId())
.map(CashBox::getTotalAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add)))
.collect(Collectors.toList());
结果
[Merchant{merchantId=1, totalAmount=3000}, Merchant{merchantId=1, totalAmount=3000}, Merchant{merchantId=2, totalAmount=3500}, Merchant{merchantId=2, totalAmount=3500}]
但显然,流返回四个对象而不是所需的两个。
我意识到,地图(第 2 行)为每个 cashBoxId 创建了四个对象。而且我不知道如何按merchantId 过滤或获得不重复的结果。
【问题讨论】:
标签: java java-stream grouping