Почему мы получаем пустую карту, когда очищаем ее значения в Java? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть карта.

Map<UUID, List<UUID>> parentsMap

Когда я пытаюсь очистить значения:

parentsMap.values().clear()

Это полностью очищает мою карту. Я могу сделать только так:

parentsMap.forEach((k, v) -> v.clear())

Я знаю, что когда мы редактируем .keySet () карты, мы меняем исходную карту. Но почему, когда мы редактируем значения (), это влияет на ключи ??

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вы также можете сделать map.replaceAll ((k, v) -> null); :)

Но в любом случае, если вы посмотрите на значения () Javadoc

Сбор значений ()

Возвращает коллекцию значений содержится в этой карте. Коллекция поддерживается картой, поэтому изменения на карте отражаются в коллекции, и наоборот. Если карта изменяется во время выполнения итерации по коллекции (кроме как через собственную операцию удаления итератора), результаты итерация не определена. Коллекция поддерживает удаление элементов, который удаляет соответствующее отображение с карты через Iterator.remove, Collection.remove, удалить все, сохранить все и очистить операции. Он не поддерживает операции add или addAll.

0 голосов
/ 04 мая 2018

Вы можете использовать parentsMap.values().forEach(List::clear)

вместо

parentsMap.forEach((k, v) -> v.clear())

Hashmap всегда изменяется при изменении ключа-> значения

0 голосов
/ 04 мая 2018

Вот что говорит Javadoc:

java.util.Map.values ​​()

Возвращает коллекционное представление значений, содержащихся в этой карте. Коллекция поддерживается картой, поэтому изменения карты отражаются в коллекции, и наоборот . Если карта изменяется во время выполнения итерации по коллекции (кроме как через собственную операцию удаления итератора), результаты итерации не определены. Коллекция поддерживает удаление элементов, которое удаляет соответствующее отображение с карты, с помощью операций Iterator.remove, Collection.remove, removeAll, retainAll и clear . Он не поддерживает операции добавления или добавления всех.

Так же, как редактирование keySet() изменило основу Map, так же как и редактирование values().

Поскольку вы хотите применить операцию clear к каждому отдельному List<UUID> значению Map, вы должны выполнить итерацию по всем значениям и вызывать clear() для каждого из них отдельно, как вы это делали в своем parentsMap.forEach((k, v) -> v.clear()) звонок. Вы также можете сделать parentsMap.values().forEach(List::clear).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...