如何高效拆分Map<String, List<Item>>为两个含重叠键的Map
一次性拆分Map<String, List- >为两个分类Map
需求说明
需要将一个Map<String, List<Item>>按Item的owned属性拆分为两个Map:
- 一个仅包含所有
owned=true的Item列表(对应原Map的键) - 另一个仅包含所有
owned=false的Item列表(对应原Map的键)
要求仅遍历原Map一次,提升效率。
解决方案(Kotlin实现)
首先定义Item数据类:
data class Item(val owned: Boolean)
核心拆分逻辑使用fold实现单次遍历:
val sourceMap = mapOf( "key1" to listOf(Item(owned = true), Item(owned = false)), "key2" to listOf(Item(owned = false), Item(owned = false)), "key3" to listOf(Item(owned = true), Item(owned = true)) ) // 单次遍历完成拆分 val (ownedMap, unOwnedMap) = sourceMap.fold( Pair(mutableMapOf<String, List<Item>>(), mutableMapOf<String, List<Item>>()) ) { (ownedAcc, unOwnedAcc), (key, items) -> // 拆分当前键对应的Item列表 val (ownedItems, unOwnedItems) = items.partition { it.owned } // 仅保留非空的子列表 if (ownedItems.isNotEmpty()) ownedAcc[key] = ownedItems if (unOwnedItems.isNotEmpty()) unOwnedAcc[key] = unOwnedItems Pair(ownedAcc, unOwnedAcc) }
逻辑说明
- 单次遍历:通过
fold遍历原Map的每一个键值对,同时维护两个可变Map作为结果累加器 - 列表拆分:对每个键对应的Item列表,用
partition快速拆分出符合条件的两个子列表 - 过滤空列表:仅当拆分后的子列表非空时,才将键值对加入结果Map,避免无效键的存在
- 结果解构:最后通过解构直接得到两个目标Map,完全匹配预期输出
内容的提问来源于stack exchange,提问作者soundsofpolaris
相关产品推荐
相关产品推荐

