如何按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
相关产品推荐
相关产品推荐

