За счёт какого ограничения mapValues сохраняет тип Dictionary при преобразовании значений?
mapValues изменяет только значения, оставляя каждый исходный ключ без изменений. Поэтому количество и уникальность ключей сохраняются, и результат остаётся Dictionary, в отличие от общего map, который преобразует элементы последовательности в массив.
Общий map предназначен для преобразования каждого элемента любой последовательности. Для Dictionary элементом является пара «ключ-значение», поэтому преобразование пары не обязано сохранять структуру словаря: новый ключ может совпасть с уже существующим или вообще исчезнуть.
mapValues решает более узкую задачу: изменить значения без перестройки множества ключей. Это позволяет выразить намерение явно и не заставляет вручную собирать новый словарь.
Если нужно преобразовать только значения словаря, использование общего map даст последовательность результатов, а не словарь. При ручном преобразовании ключей появляется риск получить дубликаты ключей: словарь не может хранить несколько значений под одним ключом.
Неверный выбор операции может привести не только к другому типу результата, но и к потере данных при восстановлении словаря из преобразованных пар. Кроме того, порядок обхода Dictionary не следует использовать как часть логики результата.
mapValues получает каждую пару словаря, сохраняет её ключ и вычисляет новое значение переданной функцией. Поскольку ключи не меняются, сохраняется инвариант уникальности ключей, а тип результата известен как словарь с тем же типом ключа и новым типом значения.
Общий map работает на уровне элементов Dictionary, то есть на уровне пар. Он не обязан сохранять ключи и поэтому возвращает массив преобразованных элементов. Это соответствует контракту Sequence.map, а не специальной семантике словаря.
В примере withTax остаётся словарём: ключи не изменяются, а значения пересчитываются. pairs является массивом кортежей, поскольку общий map преобразует элементы последовательности и не обязан собирать их обратно в словарь.
Операция mapValues не предназначена для переименования ключей, фильтрации записей или объединения нескольких ключей. Для таких задач потребуется другая операция, например filter, общий map с последующей явной сборкой словаря или специализированная логика разрешения конфликтов.
Сервис возвращает словарь идентификаторов товаров и их цен, а экрану нужны те же идентификаторы с ценами в другой валюте. Вариант с общим map создаёт массив пар, после чего нужно вручную собирать словарь; это избыточно и усложняет тип результата.
Вариант с преобразованием ключей опаснее: если два идентификатора после преобразования совпадут, один из результатов придётся потерять или специально объединить. Выбранный вариант — mapValues, поскольку ключи должны остаться неизменными.
В результате сохраняется удобный доступ по идентификатору, тип словаря выводится статически, а логика преобразования ограничивается только пересчётом цен. Если требуется удалить товары или изменить их идентификаторы, mapValues уже не подходит.
Дополнительный вопрос: Можно ли с помощью mapValues изменить ключи словаря?
Ответ: Нет. Замыкание mapValues получает значение, а ключи сохраняются библиотекой автоматически. Для изменения ключей нужно преобразовать пары другим способом и явно решить проблему возможных совпадений новых ключей.
Дополнительный вопрос: Что произойдёт, если преобразование значения вернёт nil?
Ответ: Результат не станет автоматически словарём с удалённой записью. Если тип нового значения допускает nil, например Int?, ключ сохранится, а nil станет его значением. Для удаления записей нужно явно применить фильтрацию или собрать новый словарь по условию.
Дополнительный вопрос: Гарантирует ли mapValues порядок элементов в полученном словаре?
Ответ: Нет, словарь не следует использовать как упорядоченную коллекцию. mapValues сохраняет соответствие ключей и преобразованных значений, но порядок обхода не является надёжным контрактом для бизнес-логики, сериализации или сравнения результатов.