You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:13:23