我无法理解MutotMap和Kotlin中的Map之间有什么不同?
上的示例我不知道为什么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
}
}
答案 0 :(得分:2)
MutableMap
是Map
的可变版本,因此,如果您使用MutableMap
,则可以修改,更改元素值,等等。
例如:
val person = mutableMapOf("Kelvin" to 19)
person["Kelvin"] = 25
println(person) // {Kelvin=25}
key
,value
对person["angel"] = 17
println(person) // {Kelvin=25, angel=17}
person.remove("Kelvin")
println(person) // {angel=17}
如果您使用地图的不可变版本Map
答案 1 :(得分:1)
我看到您的困惑-val
和var
定义了指针的可变性-即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
。