在Kotlin中MutableMap和Map有什么不同?

时间:2017-11-03 03:00:24

标签: kotlin

我无法理解MutotMap和Kotlin中的Map之间有什么不同?

以下代码来自https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/DbClasses.kt

上的示例

我不知道为什么val map被设计为MutableMap,我认为它应该是Map,因为它是数据库表的字段。

你能告诉我为什么var map被设计为MutableMap吗?

class CityForecast(val map: MutableMap<String, Any?>, val dailyForecast: List<DayForecast>) {
    var _id: Long by map
    var city: String by map
    var country: String by map

    constructor(id: Long, city: String, country: String, dailyForecast: List<DayForecast>)
            : this(HashMap(), dailyForecast) {
        this._id = id
        this.city = city
        this.country = country
    }
}

3 个答案:

答案 0 :(得分:2)

MutableMapMap的可变版本,因此,如果您使用MutableMap,则可以修改,更改元素值,等等。

例如:

  1. 向元素添加新值
val person = mutableMapOf("Kelvin" to 19)
person["Kelvin"] = 25
println(person) // {Kelvin=25}
  1. 向地图添加新的keyvalue
person["angel"] = 17
println(person) // {Kelvin=25, angel=17}
  1. 从地图上删除元素
person.remove("Kelvin")
println(person) // {angel=17}

如果您使用地图的不可变版本Map

,则无法执行这些操作

答案 1 :(得分:1)

我看到您的困惑-valvar定义了指针的可变性-即val始终指向内存中的同一对象-尽管它没有说明该对象是否可以或无法更改其属性。 var指出您的变量可以更改/指向不同的对象。

当您这样声明地图时:

val cities = mutableMapOf(1 to "Paris", 4 to "Rome", 2 to "Viena", 3 to "Barcelona")  

然后,您可以在此地图中添加或删除元素,因为它是可变的。但是您不能将指针更改为其他集合。

如果您有两张代表欧洲城市和美国城市的地图,则为图片:

val citiesEu = mutableMapOf (1 to "Paris", 4 to "Rome", 2 to "Viena", 3 to "Barcelona")  

val citiesUS = mutableMapOf(1 to "New York", 4 to "L.A.", 2 to "Dallas", 3 to "Washington")

val myCities = mutableMapOf<Int, String>() 

您需要根据所选状态进行切换,例如:

if (code == "US") 
    myCities = citiesUS 
else 
    myCities = citiesEU

由于val(无法重新分配),您将无法执行此操作,您需要将其更改为: var myCities = mutableMapOf()

答案 2 :(得分:0)

Map是只读的。 MutableMap是可变的。因为var可以写成新值,所以它必须是一个可变变量作为委托属性。如果您仅在val上使用委托属性,则可以改为使用Map