获取方法在常规地图(Get method for maps in groovy)

2019-10-29 21:20发布

在Config.groovy中:

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

在QuartzSchedulerJob我想用T1T2templateId作为键进入相应的值parameterMap ,但它返回我null[:]分别parameterMap.templates.get("${v}")但我想['X','Y','Z']['Z']分别为T1T2

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 [:]
        }
    }
}

Answer 1:

"${k}"是一个奇怪的表情,我看到了很多的Groovy代码。 我很想知道是谁和/或什么(书/博客/ ???)莫名其妙地得到利用语法的人。 我看到它经常在toString方法是打算返回一个类字段的值,如

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

为什么不返回的变量?

String toString() {
   name
}

你在这里做这个,做一个GString "${k}"隐式只有一个单一的内置变量并没有其他的字符,然后比较它时,它转换为字符串currentTime (它的工作原理,但远不够理想或明智的),并使用该GString产生(在一个非常时髦的方式),以在一个潜在的关键Map调用时getgetAt ,并想知道为什么这个奇怪的小内的值GString ,这是非常接近是一个映射键(如蒂姆指出的值time地图是单元素List S和的钥匙templates地图是String S的是这些的单一元素List S)是不是也自动地转换成你想要的它已经。

Groovy中做大量的隐式转换,但签名get的方法MapObject get(Object key) (在技术上它有一个通用的返回类型,但是这不是与此有关),所以Groovy不是打算做任何转换为你-你传递一个Object作为参数,需要一个方法Object 。 我们没有理由在所有期望它会被转换为字符串,或任何类型的任何键的,或者任何东西。

这禄伤害了我的大脑:

String templateId = "${v}".replaceAll("\\[", "").replaceAll("\\]","")

你把名单v ,将其转换为String通过闲来无事在嵌入它GString ,胁迫的Groovy的转换GStringString ,因此它可以调用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
        }
    }
}


文章来源: Get method for maps in groovy
标签: grails config