java的金额汇总代码_Java中list集合根据字段汇总金额

本文详细介绍了如何使用Java的Stream API,结合lambda表达式和自定义Collector,来根据对象的特定字段(如id和currency)进行分类,并对相同分类的金额进行汇总。通过创建一个新的Foo类,包含merge方法来合并相同类别的对象,并使用Collectors.groupingBy和Collectors.reducing等方法,实现了一次和两次循环的不同解决方案。
摘要由CSDN通过智能技术生成

既然题主提到说要用lambda表达式,而lambda本质来说就是一种写法,用stream的内部循环和传统的外部循环来比较,那就是写法不一样,写法不一样那就更应该明确当前需要的输入和输出了,输入是给清楚了,但是输出呢?题主只是说要返回一个新的List集合,这个List里装的啥?不同的东西最终可能导致写法的不太一致,没准思考方式也不太一样哈

我暂且以最终还是返回List为例,做个参考。

如果你想直接看最后的答案,可以直接拖到最后,下面只是我的一个思考过程而已

因为这里需要处理的主要问题就是相同的id和currency上的amount相加,那归根到底就是相同的id和currency的Foo对象要放在一起处理,这就是归类,归类在stream的api当然就要用Collectors.groupBy方法了

Collectors.groupBy有三个重载方法

groupingBy(Function classifier)

groupingBy(Function classifier, Collector downstream)

groupingBy(Function classifier, Supplier mapFactory, Collector downstream)

我把泛型去掉方便好看,其实参数也就是三种

classifier:根据什么方式去做分类,这是一个Function

mapFactory:最终分类的数据以什么类型map存放,因为分类嘛,就是相同类型的对象在一起,所以最终肯定是一个map结构

downstream:同一类的对象应该什么方式去做收集或者叫聚合

为了方便理解这三个参数,我们如果直接使用Collectors.groupingBy(Foo::getId)最后得到的就是Map>

List fooList = new ArrayList<>();

Map> map = fooList.stream().collect(Collectors.groupingBy(Foo::getId));

我们可以看一下一个参数的Collectors.groupingBy是怎么实现的

131517f29bd7360a24ca2d23fb05c531.png

它调用的是两个参数的方法,并且给downstream参数传递的是常用的toList()方法

这两个参数的方法又是调用的三个参数的方法

a199cc5a61e2bc42a1381f44a218bae1.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值