在Config.groovy中:
Query {
parameterMap {
time.'1328' = ['T1']
time.'1329' = ['T2']
templates.'T1' = ['X','Y','Z']
templates.'T2' = ['Z']
}
}
在QuartzSchedulerJob我想用T1
和T2
被templateId
作为键进入相应的值parameterMap
,但它返回我null
和[:]
分别parameterMap.templates.get("${v}")
但我想['X','Y','Z']
和['Z']
分别为T1
和T2
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
(它的工作原理,但远不够理想或明智的),并使用该GString
产生(在一个非常时髦的方式),以在一个潜在的关键Map
调用时get
和getAt
,并想知道为什么这个奇怪的小内的值GString
,这是非常接近是一个映射键(如蒂姆指出的值time
地图是单元素List
S和的钥匙templates
地图是String
S的是这些的单一元素List
S)是不是也自动地转换成你想要的它已经。
Groovy中做大量的隐式转换,但签名get
的方法Map
为Object get(Object key)
(在技术上它有一个通用的返回类型,但是这不是与此有关),所以Groovy不是打算做任何转换为你-你传递一个Object
作为参数,需要一个方法Object
。 我们没有理由在所有期望它会被转换为字符串,或任何类型的任何键的,或者任何东西。
这禄伤害了我的大脑:
String templateId = "${v}".replaceAll("\\[", "").replaceAll("\\]","")
你把名单v
,将其转换为String
通过闲来无事在嵌入它GString
,胁迫的Groovy的转换GString
为String
,因此它可以调用replaceAll
就可以了,除去那些在开始时托架和所述的端部toString
的形式AbstractCollection
,以提取单个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
}
}
}