侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Kotlin 集合 Map对象介绍

Z同学
2021-10-18 / 0 评论 / 0 点赞 / 636 阅读 / 4,724 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

Map对象也是属于集合的一种。但是相较于集合,Map的数据是Key,Values。以键值对的形式存在。

所以集合的很多操作和函数,在map中有一些变动。

下面主要介绍map中的一些特殊性方法。

方便我们在Kotlin中使用Map对象进行存储操作。

查询 get()

由于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值对象。

getOrElse()和getOrDefault()

那么,我们如果在查找数据,不存在的时候。希望有其他方法进行替换。该如何处理?

很简单,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

获取Key列表和values列表

获取的方法很简单。

示例:

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]

修改put()

如果要将一条数据添加到已经存在的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}

删除 remove()

首先和添加与修改一样。你的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}

removeIf()

我们在针对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}
0

评论区