Получение объекта со строковым ключом из карты в методе преобразования

#java #hashmap

#java #hashmap

Вопрос:

У меня странная проблема с этими строками кода (цикл for предназначен только для моей отладки):

   protected final List<Long> extractIdFromResult(Map<String, Object> pResult, String pKey) {
    for (String key : pResult.keySet()) {
      Object o = pResult.get(key);
      if (null == o){
        System.out.println("is null");
      }
    }
    return new SqlArrayExtractor<Long>(pResult.get(pKey)).extract(new Transformer() {
      @Override
      public Long transform(Object pInput) {
        return Long.valueOf(((BigDecimal) pInput).longValue());
      }
    });
  }
  

метод вызывается для извлечения идентификаторов (Longs) из сохраненной процедуры.
is null никогда не записывается в консоль, и я никогда не ввожу, if (null == o){ потому что o не равно null.
Тем не менее, если я ввожу public Long transform(Object pInput) pInput , всегда равно нулю!

Как это может произойти? Эта строка работает довольно хорошо: Object o = pResult.get(key);

Спасибо за вашу помощь

Стефан

Комментарии:

1. Что такое SqlArrayExtractor ? Ваш собственный класс или из какой-либо библиотеки?

2. Вы уверены, что значение pKey содержится в pResult.keySet() ?

3. хммм. собственный класс … 🙂 спасибо за подсказку

Ответ №1:

Есть вероятность, что pKey недоступен в map, поэтому запустите следующий код, чтобы проверить, так ли это. Цикл никогда не выдаст значение null, потому что вы повторяете набор ключей, который вы получили с карты.

 protected final List<Long> extractIdFromResult(Map<String, Object> pResult, String pKey) {
    System.out.println("is pKey available in map " pResult.get(pKey));
    // There is a chance that the pKey can be something which is not available in the map.
    return new SqlArrayExtractor<Long>(pResult.get(pKey)).extract(new Transformer() {
      @Override
      public Long transform(Object pInput) {
        return Long.valueOf(((BigDecimal) pInput).longValue());
      }
    });
} 
  

Комментарии:

1. нет, это не так, он проверяет наличие ключа, а не pKey. Объект o = pResult.get(ключ); который находится в наборе ключей maps

2. Затем вам нужно будет показать нам код SqlArrayExtractor.