Очень короткий и простой пост об удалении элементов из 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 Iteratoreach = 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”