我希望构造一个带有动态键的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]
答案 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