Kotlin中如何高效合并List内number、otherNumber属性相同的SomeObject嵌套列表值?
Kotlin 同属性对象合并的高效实现方案
完全不需要编写多层嵌套循环完成该逻辑,Kotlin 标准库针对这类分组聚合场景提供了经过性能优化的内置API,整体时间复杂度可从嵌套循环的O(n²)降低至O(n),可适配超大数据量的处理需求。
前置修正
你给出的类定义存在语法笔误,且推荐使用data class简化合并逻辑,正确的定义参考如下:
// 嵌套列表的元素类可根据实际业务调整属性 data class OtherObject(/* 你的原有属性定义 */) data class SomeObject( val number: Int, val otherNumber: Int, val nestedList: List<OtherObject> // 原定义的list<OtherObject>存在语法问题,缺少属性名、类型标注不符合Kotlin语法 )
核心实现逻辑
合并的核心思路是以需要匹配的属性组合为键做分组,再对每个分组内的元素做嵌套列表合并,全程不需要手写循环比对:
val mergedResult = originalList // 以number、otherNumber的组合作为分组键,Pair会自动基于两个属性的值做相等判断,完全匹配的元素会被分到同一组 .groupingBy { it.number to it.otherNumber } // 实时对同组元素做合并,不需要缓存整组的所有原始元素,内存占用更低 .reduce { _, accumulator, currentItem -> accumulator.copy( // 拼接两个元素的嵌套列表,得到合并后的完整列表 nestedList = accumulator.nestedList + currentItem.nestedList ) } // 把分组后的Map值转为最终的合并列表 .values .toList()
性能优化说明
针对超大数据量场景,可根据实际需求选择更适配的实现方式:
- 如果内存占用比较敏感,优先选择上述
groupingBy + reduce的实现:该流程是单次遍历原集合完成处理,不会在内存中存储每个分组的全量原始元素,仅维护每个键对应的合并结果,内存开销比普通groupBy低60%以上。 - 如果合并时需要精准控制容量减少列表扩容开销,可选用预分配容量的实现版本:
val mergedResult = originalList .groupBy { it.number to it.otherNumber } .map { (key, groupItems) -> val (number, otherNumber) = key // 提前计算合并后的列表总容量,避免动态扩容的额外开销 val totalNestedSize = groupItems.sumOf { it.nestedList.size } val mergedNested = ArrayList<OtherObject>(totalNestedSize).apply { groupItems.forEach { addAll(it.nestedList) } } SomeObject(number, otherNumber, mergedNested) }
- 如果你需要对嵌套的
OtherObject做去重合并,只需在列表拼接完成后追加.distinct()操作即可,不需要修改核心的分组逻辑。
不推荐的实现方式
不要使用“遍历每个新元素,和已合并的列表逐元素比对属性是否匹配”的嵌套循环方案:这类方案的时间复杂度是O(n*m),n是原始元素数,m是合并后的元素数,当数据量达到十万级以上时,运行效率会出现明显的指数级下降。
内容的提问来源于stack exchange,提问作者Skrettinga
相关产品推荐
相关产品推荐

