Удалите несколько ключей из карты эффективным способом?

У меня есть Map<String,String> с большим количеством пар значений. Теперь я хочу удалить выбранные ключи из этого Map. Следующий код показывает, что я сделал для этого.

Set keySet = new HashSet(); //I added keys to keySet which I want to remove. 

Тогда:

Iterator entriesIterator = keySet.iterator();
while (entriesIterator.hasNext()) {
   map.remove( entriesIterator.next().toString());
} 

Это работает. Я просто хочу знать, что было бы лучшим способом достичь моего требования?

Ответ 1

Предполагая, что ваш набор содержит строки, которые вы хотите удалить, вы можете использовать метод keySet и map.keySet().removeAll(keySet);.

keySet возвращает представление Set для ключей, содержащихся на этой карте. Набор поддерживается картой, поэтому изменения в карте отражаются в наборе и наоборот.

Упрощенный пример:

Map<String, String> map = new HashMap<>();
map.put("a", "");
map.put("b", "");
map.put("c", "");

Set<String> set = new HashSet<> ();
set.add("a");
set.add("b");

map.keySet().removeAll(set);

System.out.println(map); //only contains "c"

Ответ 2

Только для полноты:

Как и предполагалось, java.util.AbstractSet#removeAll действительно выполняет итерацию по всем элементам, но с одним небольшим трюком: он использует итератор меньшей коллекции:

if (size() <= collection.size()) {
    Iterator<?> it = iterator();
    while (it.hasNext()) {
        if (collection.contains(it.next())) {
            it.remove();
        }
    }
} else {
    Iterator<?> it = collection.iterator();
    while (it.hasNext()) {
        remove(it.next());
    }
}

Ответ 3

Использование потока Java:

keySet.forEach(map::remove);