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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:35:56