🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### map集合常见方法和属性 集合可以理解为是一个容器,容器操作我们自然想到“增删改查”,但是需要注意可写集合才有“增删改查”,不可写集合只有“查”。 #### 添加元素:put、putAll 添加元素,主要有如下几种方式: 使用put方法直接追加元素,方法签名如下: ```java public fun put(key: K, value: V): V? ``` 使用putAll方法批量添加集合,无返回值,方法签名如下: ```java public fun putAll(from: Map<out K, V>): Unit ``` 使用putAll方法批量添加数组,无返回值,方法签名如下: ```java public fun <K, V> MutableMap<in K, in V>.putAll(pairs: Iterable<Pair<K,V>>): Unit { for ((key, value) in pairs) { put(key, value) } } ``` 上面的方法,我们编写一个案例,验证下,参考代码: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "佳佳" to 1, "巧巧" to 2, "依依" to 3) //追加元素 map.put("玲玲", 4) println(map) //批量添加一个map map.putAll(mapOf("婷婷" to 5)) println(map) //批量添加一个array map.putAll(listOf(Pair("贝贝", 6))) println(map) } ~~~ 运行结果 ``` {佳佳=1, 巧巧=2, 依依=3, 玲玲=4} {佳佳=1, 巧巧=2, 依依=3, 玲玲=4, 婷婷=5} {佳佳=1, 巧巧=2, 依依=3, 玲玲=4, 婷婷=5, 贝贝=6} Process finished with exit code 0 ``` #### 删除元素:remove 删除元素,主要有如下几种方式: 使用remove方法按照key删除,成功返回key对应的value,否则返回null,方法签名如下: ```java public fun remove(key: K): V? ``` 使用remove方法按照key-value,成功返回true,否则返回false,方法签名如下: ```java public fun remove(key: K, value: V): Boolean { // See default implementation in JDK sources return true } ``` 我们编写一个案例,验证下上面这些方法,参考代码: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "佳佳" to 1, "巧巧" to 2, "依依" to 3, "婷婷" to 4) println("--------按照key删除键值对--------") val value=map.remove("佳佳") println(map) println("键 佳佳 对应的value:${value}") println("--------按照key-map删除键值对--------") var isRemove=map.remove("巧巧",3) println(map) println("key:巧巧 value:3 删除键值对成功:${isRemove}") println("--------按照key-map删除键值对--------") isRemove=map.remove("巧巧",2) println(map) println("key:巧巧 value:2 删除键值对成功:${isRemove}") } ~~~ 运行结果 ``` --------按照key删除键值对-------- {巧巧=2, 依依=3, 婷婷=4} 键 佳佳 对应的value:1 --------按照key-map删除键值对-------- {巧巧=2, 依依=3, 婷婷=4} key:巧巧 value:3 删除键值对成功:false --------按照key-map删除键值对-------- {依依=3, 婷婷=4} key:巧巧 value:2 删除键值对成功:true Process finished with exit code 0 ``` #### 修改元素:set、下标修改 集合的修改,可以通过set方法、下标操作,在Java里面是不可以通过下标操作的,Kotlin中支持下标修改集合。至于下标访问的原理,后面学了操作符重载之后就明白了,在这里,我们可以先把握使用。 当然,还可以通过put方法,去覆盖元素,之前正经经过put方法的使用,这里不再细说。 我们看看set方法的方法签名: ```java public inline operator fun <K, V> MutableMap<K, V>.set(key: K, value: V): Unit { put(key, value) } ``` 这里估计大家不懂的就是“operator”这个关键字是什么意思。这个到后期讲解操作符重载就知道了。 我们通过一个案例,来看看集合的修改操作,参考代码: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "依依" to 3, "婷婷" to 4) //set修改元素,修改下标 //修改指定位置元素,通过set方法 map.set("依依", 1) println(map) //修改指定位置元素,通过下标 map["婷婷"] = 2 println(map) } ~~~ 运行结果 ``` {依依=1, 婷婷=4} {依依=1, 婷婷=2} Process finished with exit code 0 ``` #### 查询元素:get、getOrDefault、getValue、下标 集合的查询,要通过get、getOrDefault 、getOrNull方法以及下标操作。在Java里面是不可以通过下标操作的,Kotlin中支持下标修改集合。至于下标访问的原理,后面学了操作符重载之后就明白了,在这里,我们可以先把握使用。 get方法,根据key返回value,方法签名如下: ```java public operator fun get(key: K): V? ``` 同set方法,get方法的申明上也有一个“operator”。 getOrDefault方法,根据key返回value,没有对应的value,返回默认值。方法签名如下: ```java public fun getOrDefault(key: K, defaultValue: @UnsafeVariance V): V { // See default implementation in JDK sources return null as V } ``` getValue方法,根据key返回value,没有对应的value,抛异常。方法签名如下: ```java public fun <K, V> Map<K, V>.getValue(key: K): V = getOrImplicitDefault(key) ``` 我们通过一个案例,来看看集合的查询操作,参考代码: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "佳佳" to 1, "巧巧" to 2, "依依" to 3, "婷婷" to 4) println("--------查询元素--------") //通过get方法 println(map.get("佳佳")) //通过下标 println(map["巧巧"]) //getOrDefault,没有对应的value,返回默认值 println(map.getOrDefault("静静", 100)) //通过getValue方法,没有对应的value,就抛出异常 println(map.getValue("幂幂")) } ~~~ 运行结果 ``` --------查询元素-------- 1 2 100 Exception in thread "main" java.util.NoSuchElementException: Key 幂幂 is missing in the map. at kotlin.collections.MapsKt__MapWithDefaultKt.getOrImplicitDefaultNullable(MapWithDefault.kt:24) at kotlin.collections.MapsKt__MapsKt.getValue(Maps.kt:294) at day03.MapDemo9Kt.main(MapDemo9.kt:31) Process finished with exit code 1 ``` #### 是否包含元素:contains、containsKey、containsValue 判断元素是否包含,map集合提供了contains、containsKey、containsValue方法。 contains方法,是否包含key,接收元素key,返回Boolean类型,方法定义如下: ```java public inline operator fun <@kotlin.internal.OnlyInputTypes K, V> Map<out K, V>.contains(key: K) : Boolean = containsKey(key) ``` containsKey方法,,是否包含key,接收元素key,返回Boolean类型,方法定义如下: ```java public fun containsKey(key: K): Boolean ``` containsValue方法,是否包含key,接收元素value,返回Boolean类型,方法定义如下: ```java public fun containsValue(value: @UnsafeVariance V): Boolean ``` 我们通过一个案例,来看看集合的原始是否包含操作,参考代码: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "佳佳" to 1, "巧巧" to 2, "依依" to 3, "婷婷" to 4) println("--------是否包含元素--------") //是否包含key,contains println(map.contains("佳佳")) //是否包含key,containsKey println(map.containsKey("灵灵")) //是否包含value,containsValue println(map.containsValue(1)) println(map.containsValue(5)) } ~~~ 运行结果 ``` --------是否包含元素-------- true false true false Process finished with exit code 0 ``` #### 获取数组长度: size属性、count方法 同数组,获取长度可以通过size属性和count方法去获取,参考代码: ~~~ fun main(args: Array<String>) { val map = mutableMapOf<String, Int>( "佳佳" to 1, "巧巧" to 2, "依依" to 3, "婷婷" to 4) println("--------获取集合的长度--------") println("集合长度是:${map.size}") println("集合长度是:${map.count()}") } ~~~ 运行结果 ``` --------获取集合的长度-------- 集合长度是:4 集合长度是:4 Process finished with exit code 0 ```