通过动态键访问groovy映射
我想构建一个带有动态键的groovy映射,如下所示,并希望通过动态键获得值。但我无法访问它,它为同一个密钥返回null通过动态键访问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.
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)]应该是我理解的用法。