Java两个人上传同样的文件,Java 8流-合并共享相同ID的对象的集合

I have a collection of invoices :

class Invoice {

int month;

BigDecimal amount

}

I'd like to merge these invoices, so I get one invoice per month, and the amount is the sum of the invoices amount for this month.

For example:

invoice 1 : {month:1,amount:1000}

invoice 2 : {month:1,amount:300}

invoice 3 : {month:2,amount:2000}

Output:

invoice 1 : {month:1,amount:1300}

invoice 2 : {month:2,amount:2000}

How can I do this with java 8 streams?

EDIT : as my Invoice class was mutable and it was not a problem to modify them, I choosed Eugene's solution

Collection invoices = list.collect(Collectors.toMap(Invoice::getMonth, Function.identity(), (left, right) -> {

left.setAmount(left.getAmount().add(right.getAmount()));

return left;

})).values();

解决方案

If you are OK returning a Collection it would look like this:

Collection invoices = list.collect(Collectors.toMap(Invoice::getMonth, Function.identity(), (left, right) -> {

left.setAmount(left.getAmount().add(right.getAmount()));

return left;

})).values();

If you really need a List:

list.stream().collect(Collectors.collectingAndThen(Collectors.toMap(Invoice::getMonth, Function.identity(), (left, right) -> {

left.setAmount(left.getAmount().add(right.getAmount()));

return left;

}), m -> new ArrayList<>(m.values())));

Both obviously assume that Invoice is mutable...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值