如何在Kotlin中将MoneyTransaction列表按类别汇总金额生成Map?
解决方案
你可以通过两种常见方式实现按类别汇总总金额的需求:
方式一:先分组再求和
先使用groupBy按类别分组得到每个类别对应的交易列表,再通过mapValues对每组的金额求和:
val totalByCategory = transactionList.groupBy(MoneyTransaction::category) .mapValues { entry -> entry.value.sumOf { it.amount } }
如果你的Kotlin版本低于1.4,没有sumOf函数,可以替换成sumByDouble:
val totalByCategory = transactionList.groupBy(MoneyTransaction::category) .mapValues { entry -> entry.value.sumByDouble { it.amount } }
方式二:直接分组聚合(更高效)
使用groupingBy配合sumByDouble直接完成分组与求和,这种方式不需要创建中间的交易列表,性能更优:
val totalByCategory = transactionList.groupingBy(MoneyTransaction::category) .sumByDouble { it.amount }
为什么你的原有代码没得到总金额?
你之前写的groupBy({it.category},{it.amount}),第二个参数是用来转换每个分组内的元素,最终得到的是Map<String, List<Double>>(键是类别,值是该类别下所有交易的金额列表),而不是求和后的总金额。上面两种方法都是在分组的基础上完成了金额的聚合计算。
内容的提问来源于stack exchange,提问作者jane
相关产品推荐
相关产品推荐

