Рубрики
Без рубрики

Удаление элементов с карты в Java

Очень короткий и простой пост об удалении элементов с карты на Java. Мы будем такими… С тегами java, java8, основы, новички.

Очень короткий и простой пост об удалении элементов из Map в Java. Мы сосредоточимся на удалении нескольких элементов и проигнорируем тот факт, что вы можете удалить один элемент с помощью Map.remove .

|/Карта ниже будет использоваться для этого поста:

Map map = 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(Iterator iterator = 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 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”