Kotlin如何将List<UserData>集合累加合并为单个UserData对象
实现代码(Kotlin)
fun mergeUserDataList(userDataList: List<UserData>): UserData { // 空集合边界处理,可根据业务需求调整为返回null或默认对象 if (userDataList.isEmpty()) { throw IllegalArgumentException("待合并的UserData列表不能为空") } // 1. 取最早的firstSale、最晚的lastSale val mergedFirstSale = userDataList.minOf { it.firstSale } val mergedLastSale = userDataList.maxOf { it.lastSale } // 2. 所有元素取值一致的字段,直接取首条数据对应值即可 val mergedPtuCodesList = userDataList.first().ptuCodesList val mergedCurrency = userDataList.first().currency // 3. 合并taxList:按itemDescription分组后求和同组金额 val mergedTaxList = userDataList .flatMap { it.taxList } .groupBy { it.itemDescription } .map { (description, itemList) -> ItemSale(description, itemList.sumOf { it.itemsTotalValue }) } // 合并salesList逻辑和taxList完全一致 val mergedSalesList = userDataList .flatMap { it.salesList } .groupBy { it.itemDescription } .map { (description, itemList) -> ItemSale(description, itemList.sumOf { it.itemsTotalValue }) } // 4. 累加所有数值字段 val mergedTaxTotal = userDataList.sumOf { it.taxTotal } val mergedSaleTotal = userDataList.sumOf { it.saleTotal } val mergedCanceledOrderCount = userDataList.sumOf { it.canceledOrderCount } val mergedCanceledSaleTotal = userDataList.sumOf { it.canceledSaleTotal } // 构造返回合并后的对象 return UserData( firstSale = mergedFirstSale, lastSale = mergedLastSale, ptuCodesList = mergedPtuCodesList, taxList = mergedTaxList, salesList = mergedSalesList, taxTotal = mergedTaxTotal, saleTotal = mergedSaleTotal, currency = mergedCurrency, canceledOrderCount = mergedCanceledOrderCount, canceledSaleTotal = mergedCanceledSaleTotal ) }
调用方式
val allUserData = dbRepository.getAllUsersData() val mergedUserData = mergeUserDataList(allUserData)
注意事项
- 如果使用的Kotlin版本低于1.4,
sumOf、minOf、maxOf方法可替换为对应兼容API,比如minByOrNull { it.firstSale }!!替代minOf - 代码默认输入列表的
ptuCodesList、currency取值完全一致,若业务场景存在不一致可能,可在边界校验步骤增加对应断言逻辑
内容的提问来源于stack exchange,提问作者Jumanji
相关产品推荐
相关产品推荐

