Если у меня есть immutableMap: Map<String, Int>
и вы хотите конвертировать его в mutableMap: MutableMap<String, Int>
, что бы это лучший способ сделать это? Не похоже, чтобы какой-нибудь удобный способ.Скопируйте неизменяемую карту на Mutable Map в Kotlin
ответ
Следующая функция расширения работает путем копирования Map
на MutableMap
.
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> {
return HashMap(this)
}
Во-первых, так как покрыты предыдущие вопросы о Котлин читать только коллекции и их неизменность, они действительно только для чтения жить вид вероятных изменяемых коллекций.
Котлина можно смело проверить тип для изменчивости для них, так как есть маркеры на интерфейсах, которые позволяют Котлину знать, например:
// assuming some variable readOnlyMap of type Map<String, String>
val mutableMap: MutableMap<String, String> = if (readOnlyMap is MutableMap<*,*>) {
readOnlyMap as MutableMap
} else {
HashMap(readOnlyMap)
}
Это is
проверки внутренних вызовов TypeIntrinsics.isMutableMap
и является допустимым способом знайте, является ли оно литой. Если вы сделаете эту проверку, нет никакой опасности в листинге. Вы заметите, что компилятор абсолютно счастлив и без предупреждений. Это может быть опасно, если вы не собираетесь изменять одну и ту же карту, которая рассматривается как доступная только для чтения, но показывает, что вы можете влиять на нее.
Если вам не нужна возможность изменения исходной карты, то, конечно же, всегда делайте копию, просто вызывая конструктор HashMap с другой Картой, HashMap(readOnlyMap)
. Или сделать функцию расширения:
fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this)
и называют его:
val mutableMap = readOnlyMap.toMutableCopy()
А теперь у вас есть простой способ.
Смотрите также:
- 1. Как создать неизменяемую карту из .map() JS
- 2. Получение ссылки на неизменяемую карту
- 3. Как обновить вложенную неизменяемую карту
- 4. Как создать неизменяемую карту/набор из seq?
- 5. Mutable BasicDynaBean Map
- 6. Kotlin flatMap - map
- 7. Как пройти через неизменяемую карту неизменяемых карт?
- 8. combReducers преобразует неизменяемую карту в простой объект JS
- 9. Как вы конвертируете java.util.Collections.unmodifiableMap в неизменяемую карту Scala?
- 10. Возвращая неизменяемую карту, содержащую одну измененную запись от другого
- 11. Mutable массивы как значения в ES6 Map
- 12. Kotlin Map: почему нет toHashMap()?
- 13. Scala - как построить неизменяемую карту из коллекции Tuple2s?
- 14. Как получить новую неизменяемую карту в scala из существующей карты
- 15. Как создать неизменяемую карту с учетом карты с помощью Guava?
- 16. Как построить неизменяемую карту Scala с изменяемой карты Java?
- 17. Преобразование карты Java в неизменяемую карту Scala в Java-коде
- 18. Kotlin map & уменьшить массив строк на карту <String, Any!>
- 19. Создайте неизменяемую карту из коллекции пар в Xtend
- 20. Совместное использование Mutable Map через akka actor children
- 21. scala mutable Map withDefaultValue странное поведение
- 22. Как я могу дать неизменяемую карту в Scala?
- 23. Скала неизменяемая карта, когда идти mutable?
- 24. Как использовать `filter` на экземпляре Map в Kotlin?
- 25. Загрузка нескольких наборов аннотаций на карту map map
- 26. Как добавить маркер на карту google map
- 27. Mutable-иш основная коллекция Map <int64, customObject>
- 28. Скопируйте файл на SD-карту в Cordova PhoneGap 2.1.0
- 29. Не обнуляемым Mutable Карта
- 30. Google Map Показать пустую карту
Я думаю, что вы должны явно указать генерики HashMap, иначе вы получите карту с типами/значениями платформы. –
Я бы посоветовал проверить 'is MutableMap', поскольку он может возвращать' true' для коллекций Java, которые на самом деле не изменяются. Например, попробуйте 'Collections.unmodifiableMap (mutableMapOf (" a "to" b ")) является MutableMap <*,*>'. –
Это выглядит как лучший ответ для меня. Одна вещь, которую вы можете добавить, - это пример, который не использует 'HashMap' напрямую (я считаю, что' mutableMapOf' фактически использует 'LinkedHashMap'). например: «val mutableMap = map.entries.associateTo (mutableMapOf()) {entry -> entry.toPair()}'. – mfulton26