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

如何按name字段对Product对象列表进行分组?

嘿,这个场景太常见了!你需要把后端返回的那些按name分散的Product条目,合并成每个name只出现一次、对应的maker是所有关联厂商的列表对吧?我给你两种实用的Kotlin实现方案,不管数据量大小都能搞定:

方案一:用标准库集合操作快速实现(简洁直观)

这是最省心的方式,直接借助Kotlin的groupBy和mapValues就能完成,代码可读性拉满:

// 假设你已经从后端拿到了原始数据列表:val rawProducts: List<Product>
val groupedProducts = rawProducts
    // 第一步:按name字段分组,得到键为name、值为对应Product列表的Map
    .groupBy { it.name }
    // 第二步:把每个分组里的所有maker列表扁平合并,可选去重(根据你的需求)
    .mapValues { entry ->
        entry.value.flatMap { it.maker }.distinct()
    }
    // 第三步:把Map转换回你需要的Product列表
    .map { (name, makers) -> Product(name, makers) }

小提示:如果后端返回的同一name下不会出现重复的厂商名,可以去掉distinct(),能稍微提升处理速度。

方案二:手动遍历优化性能(适合超大量数据)

如果你的数据量特别大(比如十万级、百万级),上面的方法会生成一些中间集合,可能有点内存开销。这种手动遍历MutableMap的方式更高效,能减少不必要的对象创建:

// 初始化一个可变Map,用来临时存储分组后的name和maker列表
val tempGroupMap = mutableMapOf<String, MutableList<String>>()

rawProducts.forEach { product ->
    // 用getOrPut快速获取对应name的maker列表,不存在就创建新的空列表
    val currentMakers = tempGroupMap.getOrPut(product.name) { mutableListOf() }
    // 添加当前Product的所有maker,这里也可以加判断去重:if (!currentMakers.containsAll(product.maker)) currentMakers.addAll(product.maker)
    currentMakers.addAll(product.maker)
}

// 最后把Map转成目标Product列表,按需去重
val groupedProducts = tempGroupMap.map { (name, makers) -> Product(name, makers.distinct()) }

两种方案都能完美解决你的问题,根据数据量大小选就行——小数据量用方案一省事儿,大数据量用方案二更高效。

内容的提问来源于stack exchange,提问作者Marijan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:29:02