Как избежать метода map.get (key) - PullRequest
11 голосов
/ 27 сентября 2011

У меня есть следующий код, но я увидел, что получение значений из карты при переборе ключей карты с помощью keySet() является ошибкой даже при использовании findBugs, я получаю предупреждение WMI_WRONG_MAP_ITERATOR

for(String elementId : mapElements.keySet()){

     element = mapElements.get(elementId); 

     doSomething(element);
}

Так почему же это не хорошо и как я могу это исправить?

Спасибо.

Ответы [ 3 ]

25 голосов
/ 27 сентября 2011

Если вы итерируете по всему на карте, вы можете также сделать:значения:

for (String value : mapElements.values()) {
    doSomething(value);
}

РЕДАКТИРОВАТЬ: синтаксис

0 голосов
/ 27 сентября 2011

Еще один момент заключается в том, что поиск значения каждого ключа может быть дорогостоящим, если карта большая.Таким образом, предложение Джона Скита более эффективно.Тем не менее, я допускаю, что код для перебора набора записей карты немного неуклюжий.

0 голосов
/ 27 сентября 2011

Извлечение значений из карты во время итерации по самой карте не является проблемой - проблема становится, когда вы изменяете карту, одновременно перебирая ее.В вашем случае, похоже, это не так, так что это само по себе не опасно.

Когда вы выполняете итерацию по карте, получаемый итератор основан на снимке всех записей карты на момент полученияитератор.При последующем посредничестве поведение этого итератора становится неопределенным.Это то, что не хорошо.Но опять же, в вашем случае это не относится, потому что вы не обновляете карту.

...