Map对象也是属于集合的一种。但是相较于集合,Map的数据是Key,Values。以键值对的形式存在。
所以集合的很多操作和函数,在map中有一些变动。
下面主要介绍map中的一些特殊性方法。
方便我们在Kotlin中使用Map对象进行存储操作。
由于map中的key和value都是用户自定义的,如果我们要获取values ,需要先知道key。
通过key值,查找指定的Values的值。
示例:
fun main(string: Array<String>) {
//我们随便创建一个map对象
val numbers = mapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
//通过key 直接查询指定values
println(numbers["zinyan"])
println(numbers.get("zinyan"))
//我们可以知道 [] 和get() 是等效的
println(numbers["XXX"])//如果查询的key 不存在就会返回 null
}
//输出
8
8
null
通过上面的例子,我们可以通过[]
进行简写get
方法。
同时Map也提供了一种和java中的获取方式一样的getValue()函数。
示例:
fun main(string: Array<String>) {
val numbers = mapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
println(numbers.getValue("ZXX"))
}
//输出
Exception in thread "main" java.util.NoSuchElementException: Key ZXX is missing in the map.
at kotlin.collections.MapsKt__MapWithDefaultKt.getOrImplicitDefaultNullable(MapWithDefault.kt:24)
at kotlin.collections.MapsKt__MapsKt.getValue(Maps.kt:344)
at com.zinyan.general.ListTempKt.main(ListTemp.kt:10)
Process finished with exit code 1
java.util.NoSuchElementException错误,告诉我们key:zxx不存在。
因为该方法不允许返回一个null值对象。
那么,我们如果在查找数据,不存在的时候。希望有其他方法进行替换。该如何处理?
很简单,kotlin给我们提供了两个方法 :getOrElse() : 如果键值不存在,那么按照自定义的lambda表达式的返回值返回。getOrDefault():getOrElse方法的简化,按照提供得到默认值。如果键值不存在,直接返回该默认值。
示例:
fun main(string: Array<String>) {
val numbers = mapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
//如果不存在该key 默认返回-1
println(numbers.getOrDefault("zzzx", -1))
//如果不存在该key ,默认返回表达式里面的
println(numbers.getOrElse("zzzk", { "asd" }))
}
//输出
-1
asd
获取的方法很简单。
示例:
fun main(string: Array<String>) {
val numbers = mapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
println(numbers.keys) //keys 列表
println(numbers.values) //vales 列表
}
//输出
[zinyan, Z同学, A, B, C]
[8, 88, 10, 22, 323]
如果要将一条数据添加到已经存在的map中,使用put()
函数
PS:首先你的map对象要是一个可变map:mutableMap 否则没有put方法。
示例:
fun main(string: Array<String>) {
val numbers = mutableMapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
numbers.put("zinyan.com", 2020)
//我们还可以针对put 进行简写
numbers["https:zinyan.com"] = 120000
println(numbers)
}
我们可以知道在Map集合中[]
不只是可以简写get
方法,也能简写put
方法
如果我们一次性添加多个元素时,我们可以直接使用:putAll()
示例:
numbers.putAll(setOf("four" to 4, "five" to 5))
如果该key值存在,我们使用put 和putAll的时候,都会新值覆盖老值。
因为Map的特性就是:Key值不允许重复。value可以存在相同的数据。
而put
我们可以使用[]
。那么putAll
我们可以使用+=
进行省略缩写。
示例:
fun main(string: Array<String>) {
val numbers = mutableMapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
numbers.put("zinyan.com", 2020)
//我们还可以针对put 进行简写
numbers.putAll(setOf("four" to 4, "five" to 5))
numbers+=setOf("ZZ" to 4, "YY" to 5)
println(numbers)
}
//输出
{zinyan=8, Z同学=88, A=10, B=22, C=323, zinyan.com=2020, four=4, five=5, ZZ=4, YY=5}
首先和添加与修改一样。你的map 需要属于可变Map对象mutableMap ,才能进行删除操作。否则remove方法不存在。
示例:
fun main(string: Array<String>) {
val numbers = mutableMapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
numbers.put("zinyan.com", 2020)
numbers.remove("A") //删除Key值等于A的记录
numbers.remove("Z同学",0) //第二个参数时value值。该方法就是key和value 都匹配才能删除
println(numbers)
}
//输出
{zinyan=8, Z同学=88, B=22, C=323, zinyan.com=2020}
{zinyan=8, Z同学=88, B=22, C=323, zinyan.com=2020}
相较于Java。在Kotlin中我们可以传Key和Value。同时满足才进行删除操作。
只要有一项不满足都不会进行删除。
我们直接删除指定key的参数。如果该key不存在。不会出现null错误。
相较于这种常见删除。还有一种直接删除value或者删除key。
两者任意一个被删除。Map都会清理相互关联的数据。
示例:
fun main(string: Array<String>) {
val numbers = mutableMapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
numbers.put("zinyan.com", 2020)
numbers.keys.remove("A")
numbers.values.remove(22)
println(numbers)
}
//输出
{zinyan=8, Z同学=88, C=323, zinyan.com=2020}
在上面的例子中,我们分别删除了A和B。
我们也可以通过操作符:-=进行减少Map的数据,该操作符针对的是map的key值。
示例:
fun main(string: Array<String>) {
val numbers = mutableMapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
numbers.put("zinyan.com", 2020)
numbers-="A"
numbers-="B"
println(numbers)
}
//输出
{zinyan=8, Z同学=88, C=323, zinyan.com=2020}
我们在针对map的key或者values进行remove操作时,可以指定删除的条件。
例如删除Map中values小于20的记录
示例:
fun main(string: Array<String>) {
val numbers = mutableMapOf("zinyan" to 8, "Z同学" to 88, "A" to 10, "B" to 22, "C" to 323)
numbers.values.removeIf(Predicate { it < 20 })
println(numbers)
}
//输出
{Z同学=88, B=22, C=323}