如何在IntelliJ中高亮Kotlin映射字面量的重复键?
问题描述
我在Kotlin代码里声明了一个超大的映射字面量,现在担心会出现重复键的情况。而且我不想按键排序,得保持按来源分组的结构,方便后续加条目。我用IntelliJ IDEA,想通过设置检查偏好来高亮重复键,但找了一圈没找到合适的设置,试了detekt插件也没成功。
以下是Kotlin允许的含重复键的映射示例,我希望编辑器能高亮其中的重复项:
val MF_RR_HeaderMap = mapOf<String, MFRRHeader>( // Source 1 "unit" to MFRRHeader.UNIT_NUMBER, "unit type" to MFRRHeader.UNIT_TYPE, "resident code" to MFRRHeader.TENANT_CODE, "resident name" to MFRRHeader.TENANT_NAME, // first entry "market rent" to MFRRHeader.MARKET_RENT, // Source 2 "type" to MFRRHeader.UNIT_TYPE, "sq. feet" to MFRRHeader.SQFT, "residents" to MFRRHeader.TENANT_NAME, "status" to MFRRHeader.STATUS, // This is the duplicate entry that I want to be highlighted "market rent" to MFRRHeader.STATUS, )
解决方案
1. 启用IDEA内置的重复键检查
IDEA本身就有这个功能,只是可能默认没开启:
- 打开
Settings/Preferences→Editor→Inspections - 搜索
Duplicate key in map literal,找到Kotlin分类下的该选项并勾选 - 还能设置高亮级别(警告/错误),应用设置后,编辑器会自动标红重复的键,鼠标悬停还能看到提示信息
2. 自定义函数实现编译时拦截重复键
要是想在编译阶段直接拦截重复键,不用等编辑器提示,可以自己写个替代mapOf的工具函数:
fun <K, V> mapOfUnique(vararg pairs: Pair<K, V>): Map<K, V> { val map = mutableMapOf<K, V>() pairs.forEach { (key, value) -> if (map.containsKey(key)) { error("映射里发现重复键:$key") } map[key] = value } return map }
把代码里的mapOf替换成mapOfUnique,只要出现重复键,编译时就会直接报错,还能定位到重复位置,完全不影响原有按来源分组的结构。
3. 调整detekt配置使其识别重复键
如果坚持用detekt,修改它的配置文件detekt.yml即可:
- 找到
PotentialBugs分类下的DuplicateMapKey规则,将active: false改为active: true - 重新运行detekt分析,就能检测出映射里的重复键了
内容的提问来源于stack exchange,提问作者chetan verma
相关产品推荐
相关产品推荐

