Почему MutableMap.keys возвращает MutableSet? - PullRequest
2 голосов
/ 20 марта 2020

Свойство MutableMap.keys определяется следующим образом: abstract val keys: MutableSet<K>

Я понимаю, что содержимое keys будет меняться по мере изменения базовой карты, но как само это может быть keys? модифицируемый? IE: Я не вижу логики c в вызове map.keys.add(xxx)

Rq: Я столкнулся с этой проблемой при создании прокси вокруг MutableMap. Я должен умерить содержимое entries и keys, но не хочу реализовывать методы remove/add/clear

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

MutableSet, возвращаемое keys, выбрасывает UnsupportedOperationException, если вы пытаетесь что-то добавить. Он обеспечивает операции удаления и фильтрации (retainAll), которые могут упростить действия, при которых не нужно учитывать значения, только ключи.

Если вы уже используете MutableMap, то имеет смысл, что вы также должен иметь возможность работать с ключами напрямую в изменяемой форме.

1 голос
/ 20 марта 2020

Он соответствует методу Java Map#keySet(), который задокументирован следующим образом:

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

Детали, выделенные полужирным шрифтом, объясняют, почему в Котлине это обозначено MutableSet; в противном случае вы не сможете перенести код Java, используя эти возможности.

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