目录
集合
List、Set和Map类型的变量分为两类。只读和可变
1.List
1.1.list创建与元素获取
getOrElse是一个安全索引取值函数,它需要两个参数。第一个参数:索引值;第二个参数:能提供默认值的lambda表达式,如果索引值不存在,就用默认值来代替异常奔溃
getOrNull是另一个安全索引取值函数,如果不存在就会返回返回空,而不是抛出异常。
只读list用listOf函数,可写的list用mutableListOf函数
kotlin支持使用toList和toMutableList函数动态实现只读列表可写列表的转换。
fun listTest() {
//只读
var list = listOf("huahua","wangwang","jun")
println(list.getOrElse(2) { "UnKnown" })
println(list.getOrNull(2) ?: "UnKnown")
var list2 = list.toMutableList();
list2.remove("huahua")
println(list)
println(list2)
//可写
val mutableList = mutableListOf<String>("jack", "hua", "wang")
println(mutableList.add("jun"))
println(mutableList.remove("jack"))
println(mutableList)
}
运行结果:jun
jun
[huahua, wangwang, jun]
[wangwang, jun]
true
true
[hua, wang, jun]
1.2.mutator函数
能修改可变列表的函数统一名称为:mutator函数。与java不同的是kotlin可以使用+=、-=直接操作list,来实现增加、删除元素。可以基于lambda表达式指定条件删除元素:removeIf
fun mutatorTest() {
//能修改可变列表的函数统一名称:mutator函数
val mutableList = mutableListOf<String>("jack", "hua", "wang")
mutableList += "cheng"
mutableList -= "hua"
mutableList.removeIf {
it.contains("wang")
}
println(mutableList)
}
运行结果:[jack, cheng]
1.3.集合遍历
for in遍历 一个参数:item
forEach遍历 一个参数:item
forEachIndexed遍历 两个参数:1.index 2.item
fun forListTest() {
val mutableList = mutableListOf<String>("jack", "hua", "wang")
for(s in mutableList) {
print("${s},")
}
println()
mutableList.forEach{
print("${it},")
}
println()
mutableList.forEachIndexed { index, s ->
print("${index}:${s},")
}
}
运行结果:jack,hua,wang,
jack,hua,wang,
0:jack,1:hua,2:wang,
1.4.结构
fun jiegouTest() {
val (origin, _, dest) = mutableListOf("jack", "hua", "wang")
}
_下划线表示不要此变量,就不会去声明了。字节码中可以看到:
public final void jiegouTest() {
List var3 = CollectionsKt.mutableListOf(new String[]{"jack", "hua", "wang"});
boolean var5 = false;
String var1 = (String)var3.get(0);
var5 = false;
String dest = (String)var3.get(2);
}
其中没有对下划线进行一个初始化和声明
2.Set
和list相似。不同点java和kotlin相同,set无法有相同元素,list可以有相同元素。
和list相似的方法就不多说了 如:setOf、mutableSetOf和mutator等等函数。
fun setTest() {
//只读
val set1 = setOf<String>("jack","wang","hua")
println(set1)
//可写
val set2 = mutableSetOf<String>("jack","jun","wang")
set2 += "hua"
set2 -= "jack"
println(set2)
}
运行结果: [jack, wang, hua]
[jun, wang, hua]
2.1.List和Set转换
list.toSet()转换成Set,同时去除重复元素
set.toList()转换成list
有时我们就是想要List,只是想要去除重复而已。初学者的我想到的是list.toSet().toList(),笑死了,这样太不好看了,kotlin有一个list.distinct()函数,去除重复。相信会数据库的小伙伴,知道distinct的含义了。
fun list2set() {
val mutableListOf = mutableListOf<String>("jack", "jack", "hua")
println("mutableListOf: $mutableListOf")
println("mutableListOf to set: ${mutableListOf.toSet()}")
println("mutableListOf distinct: ${mutableListOf.distinct()}")
}
运行结果:mutableListOf: [jack, jack, hua]
mutableListOf to set: [jack, hua]
mutableListOf distinct: [jack, hua]
3.Map
3.1.Map的创建
mapOf、mutableMapOf 有了上边的例子大家应该就知道它俩的作用了,前者是可读,后者是可写。
mapOf("jack" to 20, "hua" to 10)
to看上去是关键字,但事实上是省略了点号和参数的特殊函数,to将它左边和右边的值转换成一对Pair,看到下边的例子,你就能理解了。
mapOf(Pair("jack", 20), Pair("hua", 10))
这两者是相同的
3.2.读取Map的值
[]:读取键对应的值
getValue:读取键对应的值,不存在抛出异常
getOrElse:读取键对应的值,不存在使用匿名函数返回的默认值
getOrDefault:读取键对应的值,不存在返回默认值
fun getMapValue() {
val mapOf1 = mapOf("jack" to 28, "hua" to 24, "wang" to 24)
println("[]: ${mapOf1["jack"]}")
println("getValue : ${mapOf1.getValue("hua")}")
println("getOrElse : ${mapOf1.getOrElse("jun"){"Unknown"}}")
println("getOrDefault : ${mapOf1.getOrDefault("cheng", "lala")}")
}
运行结果: []: 28
getValue : 24
getOrElse : Unknown
getOrDefault : lala
3.3.map遍历
fun forEachMap() {
val mapOf1 = mapOf("jack" to 28, "hua" to 24, "jun" to 23)
mapOf1.forEach{
print("${it.key}:${it.value}|")
}
println()
mapOf1.forEach { (key, value) ->
print("${key}:${value}|")
}
}
运行结果:jack:28|hua:24|jun:23|
jack:28|hua:24|jun:23|
两个foreach在于,我们有没有给其变量名,没有给编译器给我们提供了it表示当前项。
3.4.可变集合、mutator、getOrPut
可变集合用mutableMapOf前面说过了,mutator函数对于map来讲也是可以使用操作的,其中getOrPut说一说:它也是获取当前键对应的值,但是如果所get的键不存在就添加进map中。
fun mutableMapTest() {
val mapOf1 = mutableMapOf("jack" to 28, "hua" to 24, "wang" to 24)
mapOf1 += "cheng" to 28
mapOf1 -= "hua"
mapOf1.put("zhang", 31)
println(mapOf1)
mapOf1.getOrPut("li", {90})
println(mapOf1)
}
运行结果:{jack=28, wang=24, cheng=28, zhang=31}
{jack=28, wang=24, cheng=28, zhang=31, li=90}