Фильтрация элементов карты на основе поднабора ее ключей без повторения всего объекта

У меня есть Map<String, ArrayList> и a Set<String>. Есть ли способ "пересечь" ключи карты с набором строк, чтобы остались только пары с данным ключом, без повторения всей карты? Моя главная забота - это производительность и повторное изобретательство колеса на что-то, что можно сделать более элегантно.

Ответ 1

Просто выполните:

map.keySet().retainAll(set);

В соответствии с javadoc изменения в наборе клавиш отражаются обратно на карте.

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

Вот демо:

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("1");
set.add("3");

map.keySet().retainAll(set);

System.out.println(map); // {3=three, 1=one}

Ответ 2

Разрабатывая отличный ответ BalusC, значения() также поддерживают keepAll():

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);   // prints {1=one, 2=two}

retailAll также сохраняет повторяющиеся значения, как и следовало ожидать:

Map<String, String> map = new HashMap<String, String>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
map.put("4", "two");

Set<String> set = new HashSet<String>();
set.add("one");
set.add("two");

map.values().retainAll(set);

System.out.println(map);  // prints {1=one, 2=two, 4=two}