我正在使用groovy,今天我遇到了一个问题,调用getAt("key")返回null,但是调用get("key")返回所需的对象。
所讨论的方法调用是一个更大的脚本的一部分,其中我在其他地方使用getAt()。只有一个特定的实例,我必须使用get("key")而不是getAt("key")
对不起,我不能在这里粘贴代码。
我只是在寻找一个解释,为什么get和getAt会在引用一个键(不是索引)时产生不同的结果
就我所知,它们在groovy
中的哈希映射方面应该是相同的theMap = ["A": [:],
"B": [:],
"C": [:],
"D": [:],
"E": [:],
"F": [:],
"G": [:],
"H": [:],
"I": [:],
"J": [:]]
后面的代码中有....
if (theMap.getAt("J").keySet().contains(iterationVariable)) {
theMap.getAt("J").getAt(iterationVariable).add("someStuff")
} else {
theMap.getAt("J").put(iterationVariable, ["someStuff"])
}
空指针异常发生在
theMap.getAt("J").getAt(iterationVariable).add("somestuff")
在第二次迭代之后,此时J已经看起来像这样"J": ["someKey": ["some other stuff"]]
如果我把getAt改成get,效果会很好
假设所讨论的对象是Map
,因此您引用的get("key")
方法是Map.get(Object key)
方法,那么Groovy getAt("key")
方法将做完全相同的事情,因为它在类DefaultGroovyMethods
中这样实现:
public static <K,V> V getAt(Map<K,V> self, K key) {
return self.get(key);
}
可以看到,当上下文对象是Map
时,getAt()
只调用get()
。
并不能真正回答你的问题,但是你可以这样做:
theMap = ["A": [:],
"B": [:],
"C": [:],
"D": [:],
"E": [:],
"F": [:],
"G": [:],
"H": [:],
"I": [:],,
"J": [:]]
letter = 'J'
key = 'someKey'
stuff = 'someStuff'
theMap[letter].get(key, []) << stuff
assert theMap.J == [someKey:['someStuff']]
做同样的事情
它们至少在某些情况下返回相同的结果,在Groovy控制台中运行此命令,您将看到两个断言都通过
def m = [a: 2]
assert m.getAt('a') == 2
assert m.get('a') == 2
至于为什么它们在你的情况下不返回相同的结果,谁知道呢,你还没有告诉我们任何关于你的代码。