如何在Kotlin中无中间可变Map反转A->Collection<B>的一对多映射?
实现无中间可变映射的一对多关联反转
可以用Kotlin标准库的flatMap配合groupBy直接实现,完全不需要手动维护可变映射:
data class Revision(val id: String) // 补充Revision示例定义,实际可根据你的结构调整 data class Change(val dependencies: Collection<Revision>) fun main() { val changes = listOf( Change(setOf(Revision("rev1"), Revision("rev2"))), Change(setOf(Revision("rev1"))), Change(setOf(Revision("rev3"))) ) val reversedMap: Map<Revision, List<Change>> = changes .flatMap { change -> change.dependencies.map { dep -> dep to change } } .groupBy(keySelector = { it.first }, valueTransform = { it.second }) // 验证输出 reversedMap.forEach { (rev, changes) -> println("Revision ${rev.id} 被 ${changes.size} 个变更依赖") } }
逻辑解析
- flatMap 阶段:把每个
Change拆成多个(Revision, Change)键值对,让每个依赖项都和当前变更建立关联,将一对多结构展开为扁平的键值对序列。 - groupBy 阶段:以
Revision作为键,自动把对应的Change收集为列表,直接生成不可变的Map<Revision, List<Change>>,完全满足你的需求。
如果希望值集合是Set而非List,可以在groupBy后追加转换:
val reversedMapWithSet: Map<Revision, Set<Change>> = changes .flatMap { change -> change.dependencies.map { dep -> dep to change } } .groupBy({ it.first }, { it.second }) .mapValues { it.value.toSet() }
内容的提问来源于stack exchange,提问作者Mirrana
相关产品推荐
相关产品推荐

