通过动态键访问groovy映射

通过动态键访问groovy映射,groovy,hashmap,Groovy,Hashmap,我想构建一个带有动态键的groovy映射,如下所示,并希望通过动态键获得值。但我无法访问它,它为同一个密钥返回null class AmazonPackage { public static String WEIGHT = "WEIGHT" } class PackageTests { @Test void "map should return value by dynamic key" () { def map = [ ("${AmazonPackage.

我想构建一个带有动态键的groovy映射,如下所示,并希望通过动态键获得值。但我无法访问它,它为同一个密钥返回null

class AmazonPackage {
    public static String WEIGHT = "WEIGHT"
}

class PackageTests {

   @Test
   void "map should return value by dynamic key" () {
       def map = [ ("${AmazonPackage.WEIGHT}") : 100, "id": "package001"]

       assert map['id'] == "package001"

       //assert map[("${AmazonPackage.WEIGHT}")] == 100
       //assert map."${AmazonPackage.WEIGHT}" == 100

       assert 2 == map.keySet().size()
       assert map."WEIGHT" == 100 //fails
    }

    @Test
    void "map should return value by simple key" () {
        def map = ["w" : 100]
        assert map."w" == 100
    }

}
我的失败是

Assertion failed: 

assert map."WEIGHT" == 100
       |   |        |
       |   null     false
       [WEIGHT:100, id:package001]

首先,如果您想使用“.”运算符从映射中获取值,则可以直接提供键,如
map.key
,以从映射中获取键“key”的值


其次,由于
“${AmazonPackage.WEIGHT}”
的类是
GStringImpl
而不是普通的
String
对象,因此不能使用简单的“.”运算符获取其值,而应该使用
get()
。此外,只有将键作为GStringImpl而不是纯字符串对象提供时,此get才会返回结果:
map.get(${AmazonPackage.WEIGHT}”)
不幸的是,您存储的map键是一个
GString
,而不是
字符串。这意味着地图并不认为这些键相等

如果要使用字符串值访问地图,应将键存储为字符串:

def map = [ ("${AmazonPackage.WEIGHT}".toString()) : 100, "id": "package001"]
assert map."WEIGHT" == 100

我建议将地图设置为:

def map=[(AmazonPackage.WEIGHT):100,“id”:“package001”]

这样做你的断言:


断言映射[AmazonPackage.WEIGHT]==100

完美。大多数时候我都在为
String
GString
苦苦挣扎:)回答得不错。通过删除“${…}”语法,它使键成为字符串而不是GString。我是Groovy的第一年,这个字符串/GString可能有点挑战性。对我来说,“key”(双关语)是指地图键不需要被引用,除非它们是字符串文字。所以map[“myString”]和map[myStringVariable]。。。然后Groovy提供了变量周围的paren作为键的特殊情况,因此map[(AmazonPackage.WEIGHT)]应该是我理解的用法。