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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:20