Jeśli mam immutableMap: Map<String, Int>
i chcę przekonwertować go na mutableMap: MutableMap<String, Int>
, jaki byłby najlepszy sposób na zrobienie tego? Nie wydaje się jakikolwiek dogodny sposób.Skopiuj niezmienną mapę na zmutowaną mapę w Kotlin
Odpowiedz
Następująca funkcja rozszerzenia działa, kopiując Map
do MutableMap
.
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> {
return HashMap(this)
}
Po pierwsze, jak ujęte w poprzednich pytań o Kotlin tylko do odczytu zbiorów i ich niezmienność, są one naprawdę tylko do odczytu żyć widoki prawdopodobnych modyfikowalnych kolekcjach.
Kotlin może bezpiecznie sprawdzić typ dla zmienności dla nich, ponieważ istnieją markery na interfejsy, które umożliwiają Kotlin wiedzieć, na przykład:
// assuming some variable readOnlyMap of type Map<String, String>
val mutableMap: MutableMap<String, String> = if (readOnlyMap is MutableMap<*,*>) {
readOnlyMap as MutableMap
} else {
HashMap(readOnlyMap)
}
Kontrola ta is
wewnętrznie wywołuje TypeIntrinsics.isMutableMap
i jest poprawnym sposobem wiedzieć, czy można je odlewać. Nie ma niebezpieczeństwa w obsadzie, jeśli najpierw wykonasz tę kontrolę. Zauważysz, że kompilator jest całkowicie zadowolony i bez ostrzeżeń. Może to być niebezpieczne, jeśli nie zamierzasz modyfikować tej samej mapy traktowanej jako tylko do odczytu, ale pokazuje ona, że możesz rzucić o afekt.
Jeśli nie chcesz modyfikować oryginalnej mapy, oczywiście zawsze rób kopię, po prostu wywołując konstruktora HashMap z inną mapą, HashMap(readOnlyMap)
. Lub złożyć funkcję przedłużacza:
fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this)
i nazywają go:
val mutableMap = readOnlyMap.toMutableCopy()
A teraz masz prostą drogę.
Zobacz także:
- 1. Efektywnie "modyfikując" niezmienną mapę
- 2. Dlaczego mamy niezmienną pustą mapę?
- 3. Kotlin, kiedy delegować przez mapę?
- 4. Jak przekonwertować tę mapę/płaską mapę na Scala?
- 5. Konwertuj obiekt JsonNode na mapę
- 6. Parse string na mapę Golang
- 7. Wydrukuj mapę w LeafletJS
- 8. Konwertuj mapę bitową na ikonę
- 9. python: rozciągnij mapę świata
- 10. Jak zdefiniować mapę w swagger?
- 11. Jak przeglądać mapę w Thymeleaf
- 12. Załaduj dynamicznie mapę CBT
- 13. Jak wydrukować mapę w Scali
- 14. Utwórz mapę konturową
- 15. Inicjuj mapę Google w AngularJS
- 16. Jak odświeżyć mapę Google.
- 17. zainicjować mapę C++ 11
- 18. Jak utworzyć mapę gry?
- 19. Konwertuj mapę bitową na wielobok - (odwracanie-rasteryzacja)
- 20. Leaflet.js centrum mapę na grupie znaczników
- 21. Jak przekonwertować mapę bitową na obraz
- 22. Delphi - jak przyciąć mapę bitową "na miejscu"?
- 23. Scala: zamapuj mapę na listę krotek
- 24. uzyskać adres po kliknięciu na mapę
- 25. Konwersja mapy Java na mapę JavaScript
- 26. Oprawa na mapę z typem KClass
- 27. gis mapowanie nakładki na mapę wielobokową
- 28. Próbujesz wyśrodkować mapę na sworzniu (MKMapView)
- 29. Konwertuj ciąg jsonów bez cudzysłowów na mapę
- 30. Jak przekonwertować listę numerów na mapę?
Myślę, że powinieneś wyraźnie określić rodzajowe elementy HashMap, w przeciwnym razie otrzymasz mapę z typami klucz/wartość platformy. –
Odradzam sprawdzanie 'is MutableMap', ponieważ może zwrócić' true' dla kolekcji Java, które nie są w rzeczywistości zmienne. Na przykład spróbuj 'Collections.unmodifiableMap (mutableMapOf (" a "do" b ")) to MutableMap <*,*>'. –
To wygląda na najlepszą odpowiedź. Jedną z rzeczy, które możesz dodać, jest przykład, który nie używa bezpośrednio 'HashMap' (uważam, że' mutableMapOf' faktycznie używa 'LinkedHashMap'). np .: 'val mutableMap = map.entries.associateTo (mutableMapOf()) {entry -> entry.toPair()}'. – mfulton26