如何在Kotlin中按多字段分组并汇总成本
Kotlin多字段分组汇总总成本
需求说明
按item和env两个字段对数据分组,汇总每组的cost总和,最终转换为TotalCost对象列表。
原始数据结构
假设原始数据类定义如下:
data class Data(val id: Int, val cost: Double, val env: String, val item: String)
原始数据集:
val dataList = listOf( Data(1, 1.0, "prod", "Storage"), Data(2, 2.0, "qa", "Storage"), Data(3, 3.0, "prod", "Storage"), Data(4, 5.0, "qa", "Bandwidth"), Data(5, 2.0, "qa", "Bandwidth"), Data(6, 5.0, "prod", "Bandwidth"), Data(7, 6.0, "prod", "Bandwidth"), Data(8, 1.0, "prod", "Bandwidth"), Data(9, 5.0, "qa", "vm"), Data(10, 2.0, "uat", "vm"), Data(11, 3.0, "qa", "vm"), Data(12, 4.0, "prod", "vm"), Data(13, 5.0, "uat", "vm") )
期望结果
目标数据类:
data class TotalCost(val item: String, val env: String, val cost: Double)
最终结果列表:
TotalCost(item="Storage", env="prod", cost=4.0) TotalCost(item="Storage", env="qa", cost=2.0) TotalCost(item="Bandwidth", env="qa", cost=7.0) TotalCost(item="Bandwidth", env="prod", cost=12.0) TotalCost(item="vm", env="qa", cost=8.0) TotalCost(item="vm", env="uat", cost=7.0) TotalCost(item="vm", env="prod", cost=4.0)
解决方案
利用Kotlin的groupBy结合sumOf实现多字段分组求和,核心是将两个分组字段组合成一个键,再对每组计算成本总和:
方法1:用Pair作为分组键
val totalCosts = dataList .groupBy { Pair(it.item, it.env) } // 以item和env的Pair作为分组标识 .map { (key, group) -> TotalCost(key.first, key.second, group.sumOf { it.cost }) }
方法2:用自定义数据类作为分组键
如果需要更清晰的键定义,可自定义分组键类:
data class GroupKey(val item: String, val env: String) val totalCosts = dataList .groupBy { GroupKey(it.item, it.env) } .map { (key, group) -> TotalCost(key.item, key.env, group.sumOf { it.cost }) }
两种方法都能得到预期结果,自定义GroupKey的方式可读性更强,适合复杂分组场景。
内容的提问来源于stack exchange,提问作者user18282672
相关产品推荐
相关产品推荐

