2016-08-10 3 views
-1

Я использую groovy, и я столкнулся с проблемой сегодня, когда вызов getAt («ключ») возвратил null, но вызов get («key») желаемый объект.getAt (<key>) возвращает null, но get (<key>) возвращает нужный объект

вызов метода является частью гораздо более крупного скрипта, где я использую getAt() где-то еще. есть только один конкретный пример, в котором я должен использовать get («ключ») вместо getAt («ключ»)

Извините, но здесь я не могу вставить код.

Я просто искал explination как, почему получить и getAt будет производить различные результаты при обращении ключа (не показатель)

Насколько я далеко они должны работать одинаково в отношении к хэш-карта в заводной

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

ваш ключ строка? – eckes

+3

Можете ли вы привести пример, который показывает, что вы имеете в виду? Трудно отлаживать анекдоты –

+0

Да Дайте мне посмотреть, смогу ли я что-нибудь написать. Будет несколько минут, хотя – switch201

ответ

0

Они возвращают тот же результат, по крайней мере в некоторых случаях, запустить это в Groovy консоли, и вы увидите, что оба утверждения проходят

def m = [a: 2] 

assert m.getAt('a') == 2 
assert m.get('a') == 2 

А почему они не возвращают один и тот же результат ваш случай, кто знает, вы ничего нам не сообщили о вашем коде.

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.

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

Чтобы сделать то же самое

+0

Да, я имею в виду технически, я уже нашел решение, которое должно использовать get вместо getAt в этом случае. Я задал этот вопрос, потому что, насколько мне известно, getAt должен работать. (Я имею в виду, что я использую его много), поэтому я просто надеялся получить представление о том, почему они могут вести себя по-другому. но спасибо за ответ – switch201

+0

Да, это был скорее комментарий о том, как вы можете упростить свой код –

+0

'theMap. '$ letter". "$ key" '- довольно медленный/странный способ написать' theMap [letter] [key] '. Я также предложил бы сделать 'theMap [letter] .get (key, []) << stuff', как показано в GroovyDoc для [' get (Object key, Object defaultValue) '] (http: //docs.groovy- lang.org/latest/html/groovy-jdk/java/util/Map.html#get(java.lang.Object,%20java.lang.Object)). – Andreas