Очень короткий и простой пост об удалении элементов из Map в Java. Мы сосредоточимся на удалении нескольких элементов и проигнорируем тот факт, что вы можете удалить один элемент с помощью Map.remove .
|/Карта ниже будет использоваться для этого поста:
Mapmap = new HashMap<>(); map.put(1, "value 1"); map.put(2, "value 2"); map.put(3, "value 3"); map.put(4, "value 4"); map.put(5, "value 5");
Есть несколько способов удалить элементы. Вы могли бы перебрать код вручную и удалить их:
for(Iteratoriterator = map.keySet().iterator(); iterator.hasNext(); ) { Integer key = iterator.next(); if(key != 1) { iterator.remove(); } }
Вот как вы могли бы это сделать без доступа к Java 8 +. Итератор необходим для предотвращения//ConcurrentModificationException s при удалении элементов из Map .
Если у вас есть доступ к более новым версиям Java (8+), то вместо этого вы можете выбрать одно из приведенных ниже:
// remove by value
map.values().removeIf(value -> !value.contains("1"));
// remove by key
map.keySet().removeIf(key -> key != 1);
// remove by entry / combination of key + value
map.entrySet().removeIf(entry -> entry.getKey() != 1);
удалить, если является методом, доступным для Коллекции s. Да, Карта сама по себе не является Коллекцией и не имеет доступа к remove If сама по себе. Но при использовании: values , keySet или entrySet возвращается представление содержимого Map |/. Это представление реализует Коллекция разрешающий удалите, если будет вызван на нем.
Содержимое, возвращаемое значениями , набором ключей и entrySet очень важны. Ниже приведена выдержка из JavaDoc для значений :
* Returns a {@link Collection} view of the values contained in this map.
* The collection is backed by the map, so changes to the map are
* reflected in the collection, and vice-versa.
*
* The collection supports element removal, which removes the corresponding
* mapping from the map, via the {@code Iterator.remove},
* {@code Collection.remove}, {@code removeAll},
* {@code retainAll} and {@code clear} operations.
Этот JavaDoc объясняет, что Collection , возвращаемый values , поддерживается Map и что изменение либо Collection , либо Map изменит другое. Я не думаю, что смогу объяснить, что говорит JavaDoc, лучше, чем то, что там уже написано… Так что я сейчас перестану примерять эту роль. Я показал только документацию для значений , но вы можете доверять мне, когда я говорю, что Набор ключей и entrySet также поддерживаются содержимым Map . Вы можете сами прочитать документы, если не верите мне.
Это также отсылает к первому примеру с использованием более старого Версия Java. В документации указано, что можно использовать Iterator.remove . Это то, что использовалось ранее. Кроме того, реализация remove If очень похожа на итератор пример. Поговорив об этом, я мог бы с таким же успехом показать это:
default boolean removeIf(Predicate super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
В этом есть кое-что еще. Но в остальном это почти то же самое.
Итак, вот и все. Не так много, чтобы сделать вывод, кроме того, что я говорю вам помнить об этом, используя: значения , Набор ключей или entrySet предоставит доступ к remove If , позволяя легко удалять записи Map .
Если вы нашли этот пост полезным, вы можете подписаться на меня в Твиттере по адресу @LankyDanDev , чтобы быть в курсе моих новых постов.
Оригинал: “https://dev.to/lankydandev/removing-elements-from-a-map-in-java-3ad4”