通过动态密钥访问groovy map

时间:2016-02-09 03:04:22

标签: groovy hashmap

我希望构造一个带有动态键的groovy map,如下所示,并希望通过动态键获取值。但是我无法访问它,它为同一个键返回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]

3 个答案:

答案 0 :(得分:7)

不幸的是,您存储的地图密钥是GString,而不是String。这意味着地图不会将这些键视为相等。

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

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

答案 1 :(得分:1)

首先,如果你想使用"从地图中获取值。"然后,您可以直接提供map.key之类的密钥来获取密钥'密钥'来自地图。

其次,由于"${AmazonPackage.WEIGHT}"的类是GStringImpl而不是普通的String对象,因此您无法使用简单的"来获取其值。&#34 ;运算符,您应该使用get()。只有当您将密钥提供为GStringImpl而不是普通的String对象时,此get才会返回结果:map.get("${AmazonPackage.WEIGHT}")

答案 2 :(得分:1)

我建议像这样设置地图:

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

像这样做你的断言:

断言地图[AmazonPackage.WEIGHT] == 100

相关问题