我正在使用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":["其他一些东西"]]
如果我更改getAt以使其正常工作。
答案 0 :(得分:0)
它们确实至少在某些情况下返回相同的结果,在Groovy控制台中运行它,你会看到两个断言都通过
def m = [a: 2]
assert m.getAt('a') == 2
assert m.get('a') == 2
至于为什么他们不会在你的案件中返回相同的结果,谁知道,你没有告诉我们你的代码。
答案 1 :(得分:0)
假设有问题的对象是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);
}
如您所见,getAt()
只在上下文对象为get()
时调用Map
。
答案 2 :(得分:0)
没有真正回答你的问题,但你可以这样做:
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']]
做同样的事情