Избегание метода map.get(key)

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

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

     element = mapElements.get(elementId); 

     doSomething(element);
}

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

Спасибо.

Ответ 1

Если вы повторяете все на карте, вы также можете:

for (Map.Entry<String, String> entry : mapElements.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    // Use the key and the value
}

Или, если вам действительно не нужен ключ, просто перебирайте значения:

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

EDIT: синтаксис

Ответ 2

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

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

Ответ 3

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