的藏品我有发票的集合:Java的8个流 - 合并对象共享相同的ID
class Invoice {
int month;
BigDecimal amount
}
我想合并这些发票,所以我每个月获得一张发票,且金额这个月的发票金额的总和。
例如:
invoice 1 : {month:1,amount:1000}
invoice 2 : {month:1,amount:300}
invoice 3 : {month:2,amount:2000}
输出:
invoice 1 : {month:1,amount:1300}
invoice 2 : {month:2,amount:2000}
我怎么能做到这一点与Java 8流?
编辑:作为我的发票类是可变的,这不是一个问题,对其进行修改,我选用尤金的解决方案
Collection<Invoice> invoices = list.collect(Collectors.toMap(Invoice::getMonth, Function.identity(), (left, right) -> {
left.setAmount(left.getAmount().add(right.getAmount()));
return left;
})).values();
或使用'Collectors.collectingAndThen(Collectors.toMap(...),m-> new ArrayList <>(m.values()))'... – Holger
@Holger好点!编辑... – Eugene
嗨! 2条评论... 1)也许这应该是'list.stream()。收集(...)'和2)您变异原'Invoice'元素,这看起来并不正确,我...你可以通过在值映射器将一个拷贝构造函数,并用它解决它 –