gpt4 book ai didi

grails - 在Groovy中获取 map 的方法

转载 作者:行者123 更新时间:2023-12-02 15:25:48 27 4
gpt4 key购买 nike

在Config.groovy中:

Query {
parameterMap {
time.'1328' = ['T1']
time.'1329' = ['T2']
templates.'T1' = ['X','Y','Z']
templates.'T2' = ['Z']
}
}

在QuartzSchedulerJob中,我想使用 T1T2作为键来获取 templateId中的相应值,但是它分别返回 parameterMapnull[:],但我想分别为 parameterMap.templates.get("${v}")['X','Y','Z']获取 ['Z']T1
def execute() {
def currentTime = new Date().format('HHmm')
grailsApplication.config.Query.parameterMap.time.each { k, v ->
if (currentTime=="${k}") {
println "${k} " + currentTime
String templateId = "${v}".replaceAll("\\[", "").replaceAll("\\]","")
println grailsApplication.config.Query.parameterMap.templates.get("${v}") //this prints null
println grailsApplication.config.Query.parameterMap.templates.getAt("${v}") //this prints [:]
}
}
}

最佳答案

"${k}"是一个怪异的表达式,在Groovy代码中我经常看到它。我很想知道是谁和/或什么(书/博客/ ???)使人们使用了这种语法。我经常在打算返回类字段作为值的toString方法中看到它,例如

private String name
...
String toString() {
"${name}"
}

为什么不只返回变量?
String toString() {
name
}

您在此处进行此操作,只将一个嵌入式变量而不包含其他字符的 GString "${k}"生成,然后在将其与 currentTime比较时将其隐式转换为String(有效,但远非最佳或明智),并使用此方法 GString在调用 Mapget时生成(以非常时髦的方式)到 getAt中的潜在键,并且想知道为什么这个奇怪的小 GString中的值非常接近作为映射键(因为Tim指出了这些值) time映射的元素是单元素 List,而 templates映射的键是 String,它们是这些 List的单个元素)也不会自动转换为您想要的样子。

Groovy进行了很多隐式转换,但是 getMap方法的签名是 Object get(Object key)(从技术上讲,它具有通用的返回类型,但这在这里不相关),因此Groovy不会为您做任何转换-您正在传递 Object作为采用 Object的方法的参数。完全没有理由期望它会被转换为String或任何键的任何类型,或任何东西。

这个地方伤了我的大脑:
String templateId = "${v}".replaceAll("\\[", "").replaceAll("\\]","")

您正在获取列表 v,将其与其他内容一起嵌入 String中,将其转换为 GString,强制Groovy将 GString转换为 String,以便它可以在其上调用 replaceAll,从而删除开头和之后的方括号 toStringAbstractCollection形式的末尾,以提取 String中的单个 v元素。

怎么样一些更直接的东西:
String templateId = v[0]

及其在 execute的清理版本中的使用:
def execute() {
String currentTime = new Date().format('HHmm')
grailsApplication.config.Query.parameterMap.time.each { k, v ->
if (currentTime == k) {
println "$k $currentTime"
String templateId = v[0]
println config.Query.parameterMap.templates[templateId] // get and getAt would also work
}
}
}

关于grails - 在Groovy中获取 map 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27758334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com