如何在Kotlin中无循环将List<ProductDetail>转为嵌套Map?
解决方法
你可以通过Kotlin标准库的groupBy配合mapValues和associateBy实现需求,完全不需要手动编写循环:
假设你希望外层Map的key是ProductDetail的name字段,内层Map的key是price字段,代码示例如下:
val productList: List<ProductDetail> = // 你的产品列表 val nestedMap: Map<String, Map<Int, ProductDetail>> = productList .groupBy { it.name } // 第一步:按name分组,得到Map<String, List<ProductDetail>> .mapValues { (_, productGroup) -> productGroup.associateBy { it.price } // 第二步:将每个分组转为以price为key的Map }
说明:
groupBy会自动将列表按指定的String字段(这里是name)分组,生成外层Map结构,key为分组字段值,value为对应分组的产品列表。mapValues遍历外层Map的每个值(即每个产品分组),将其转换为内层Map;associateBy则把分组内的每个产品映射为以指定Int字段(这里是price)为key、产品本身为value的键值对。
如果你的分组字段或内层key字段不是name和price,只需替换lambda表达式中的字段即可。
另外需要注意:如果同一个分组内存在多个price相同的产品,associateBy会保留最后一个出现的产品。如果需要处理重复key的场景,可以改用groupBy作为内层转换(得到Map<String, Map<Int, List<ProductDetail>>>),或者根据业务需求自定义处理逻辑。
内容的提问来源于stack exchange,提问作者rohit27kr
相关产品推荐
相关产品推荐

