getAt() 返回空值<key>,但 get(<key>) 返回所需的对象



我正在使用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

至于为什么它们在你的情况下不返回相同的结果,谁知道呢,你还没有告诉我们任何关于你的代码。

最新更新