Groovy中带点的Map键:除字符串索引外是否有更简便引用方式?
Groovy中访问带点的Map键的简便方法
在Groovy里,当Map同时存在嵌套键结构(比如d对应子Map里的z)和带点的顶级键(比如'd.z')时,点语法m.d.z会优先解析为访问嵌套Mapd中的z键,而非直接访问带点的顶级键'd.z'。Groovy原生语法没有支持转义点的方式,但可以通过以下方法简化带点键的访问:
1. 自定义Map扩展方法
给Map添加通用扩展方法,封装字符串索引逻辑,让调用更简洁:
// 给所有Map扩展getDot方法,专门用于访问带点的键 Map.metaClass.getDot = { String key -> delegate[key] } // 使用示例 def m = [ 'a': 'A', 'd': ['z': 'Z'], 'd.z': 'DdotZ' ] println m.getDot('d.z') // 输出 DdotZ println m.getDot('a') // 输出 A
你也可以根据习惯命名方法(比如at),只要语义清晰、不与现有方法冲突即可。
2. 提前绑定键变量
如果需要重复访问同一个带点键,可将键存入变量减少重复输入:
def targetKey = 'd.z' def m = ['d.z': 'DdotZ', 'd': ['z': 'Z']] println m[targetKey] // 输出 DdotZ
原生语法限制说明
Groovy的点语法解析规则是固定的:遇到.会优先尝试访问对象属性或嵌套Map的键,无法通过转义(比如m.d\.z)改变这一行为。因此字符串索引m['d.z']是原生语法中最直接的访问方式,上述方法都是基于该逻辑的封装优化。
验证示例
你提供的演示代码格式化后如下:
Map m = ['a': 'A', 'b': 'B'] m.put('c', 'C') m.put('d', ['z': 'Z']) m.put('d.z', 'DdotZ') println m // 输出 [a:A, b:B, c:C, d:[z:Z], d.z:DdotZ] println m.d.z // 输出 Z(访问嵌套Map) println m['d.z'] // 输出 DdotZ(直接访问带点键)
内容的提问来源于stack exchange,提问作者Alexander Stohr
相关产品推荐
相关产品推荐

