getAt(<key>)返回null但get(<key>)返回所需的对象

时间:2016-08-10 20:46:52

标签: groovy hashmap

我正在使用groovy,今天遇到一个问题,调用getAt(&#34; key&#34;)返回null但是调用get(&#34; key&#34;)返回了所需的对象。

有问题的方法调用是一个更大的脚本的一部分,我在其他地方使用getAt()。只有一个特定的实例,我必须使用get(&#34; key&#34;)而不是getAt(&#34; key&#34;)

很抱歉,但我无法在此处粘贴代码。

我正在寻找一个关于为什么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已经看起来像这样     &#34; J&#34;:[&#34; someKey&#34;:[&#34;其他一些东西&#34;]]

如果我更改getAt以使其正常工作。

3 个答案:

答案 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']]

做同样的事情