Remove multiple keys from Map in efficient way?
For the sake of completion, and since Google brings you here when you look for a way to achieve this:
map.entrySet().removeIf(entry -> /* decide what you want to remove here */ );
This does not assume you have a predefined set of keys to remove but rather assumes you have a condition on which the keys should be removed. From the question, it is unclear if these keys are added manually or based on some sort of condition. In the latter case, this might be the cleaner code.
For the former case, this (untested) code might work as well:
map.entrySet().removeIf(entry -> keySet.contains(entry.getKey()) );
But obviously the answer provided by @assylias is much cleaner in this case!
Just for the sake of completeness:
As guessed java.util.AbstractSet#removeAll
really iterates over all entries, but with one little trick: It uses the iterator of the smaller collection:
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());
}
}
Assuming your set contains the strings you want to remove, you can use the keySet
method and map.keySet().removeAll(keySet);
.
keySet
returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa.
Contrived example:
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"