上次我们学习了kotlin的字符串操作、数字类型、标准库函数,接下来我们来学习集合,和其他变量类型一样,集合也分为可变和只读
一、List
1.List集合创建与元素获取
调用listOf函数创建集合,我们可以通过和数组一样的方式: "变量下标" 来获取元素,或者使用get函数获取
代码语言:javascript复制fun main() {
//listOf创建List集合
var list = listOf("张三", "李四", "王五")
println(list[0])
println(list.get(1))
}
kotlin还提供了安全索引取值函数,使用它们就不会下标溢出了
getOrElse:如果不存在,则返回lambda结果
代码语言:javascript复制fun main() {
//listOf创建List集合
var list = listOf("张三", "李四", "王五")
println(list.getOrElse(5) { "empty" })
}
getOrNull:如果不存在,返回null
代码语言:javascript复制fun main() {
//listOf创建List集合
var list = listOf("张三", "李四", "王五")
println(list.getOrNull(10) ?: "is null")
}
2.可变List集合
调用mutableListOf创建可变list,List不支持增加元素和删除元素,MutableList支持
代码语言:javascript复制fun main() {
//调用mutableListOf创建可变list
val mutableList = mutableListOf("张三", "李四", "王五")
mutableList.remove("张三")
mutableList.add("赵六")
println(mutableList.getOrElse(1) { "empty" })
println(mutableList.getOrNull(10) ?: "is null")
}
kotlin还支持利用toList和toMutableList函数实现可变和只读列表的转换
代码语言:javascript复制fun main() {
//调用mutableListOf创建可变list
val mutableList = mutableListOf("张三", "李四", "王五")
val list = mutableList.toList()
val muList = list.toMutableList()
}
kotlin支持和c/c 一样的运算符重载,所以我们可以用 号 代替 add函数, - 号 代替 remove函数
代码语言:javascript复制fun main() {
//调用mutableListOf创建可变list
val mutableList = mutableListOf("张三", "李四", "王五")
mutableList = "孙七"
mutableList -= "王五"
}
还可以基于lambda表达式指定的条件删除元素
代码语言:javascript复制fun main() {
//调用mutableListOf创建可变list
val mutableList = mutableListOf("张三", "李四", "王五")
mutableList.removeIf { it.contains("四") }
}
3.遍历集合
kotlin新增了三种方式遍历集合
代码语言:javascript复制fun main() {
//调用mutableListOf创建可变list
val mutableList = mutableListOf("张三", "李四", "王五")
for (item in mutableList) {
println(item)
}
mutableList.forEach { println(it) }
mutableList.forEachIndexed { index, s ->
println("$index $s")
}
}
4.解构
之前我们提到过,kotlin允许在一个表达式中给多个变量赋值
可以用"_"过滤不想要的元素
代码语言:javascript复制fun main() {
//调用mutableListOf创建可变list
val mutableList = mutableListOf("张三", "李四", "王五")
val (a, _, c) = mutableList
}
二、Set
1.Set创建与元素获取
通过setOf创建,通过elementAt传入下标获取元素
代码语言:javascript复制fun main() {
val set = setOf("张三", "李四", "王五")
println(set.elementAt(1))
}
2.可变Set
通过mutableSetOf创建,其他的和list一样
代码语言:javascript复制fun main() {
val set = mutableSetOf("张三", "李四", "王五")
set = "赵四"
println(set.elementAt(1))
}
3.List转Set,去除重复元素,也可以使用distinct函数
代码语言:javascript复制fun main() {
val list = listOf("张三", "李四", "王五").toSet().toList()
val list2 = listOf("张三", "李四", "王五").distinct()
}
三、数组
用法和Java相同,也支持新增的遍历方式
四、Map
1.map创建
使用mapOf创建,使用 to 表示键值对,to实际就是调用了实例化了一个Pair类
代码语言:javascript复制fun main() {
val map = mapOf("张三" to 8, "赵四" to 16, "王五" to 20)
mapOf(Pair("张三", 8), Pair("赵四", 16))
}
2.读取map的值
[]取值运算符,读取key对应的值,不存在返回null
getValue,读取key对应的值,不存在抛异常
getOrDefault,读取key对应的值,不存在返回默认值
getOrElse,读取key对应的值,不存在返回lambda结果
代码语言:javascript复制fun main() {
val map = mapOf("张三" to 8, "赵四" to 16, "王五" to 20)
println(map["张三"])
println(map.getValue("张三"))
println(map.getOrDefault("张三", 0))
println(map.getOrElse("张三") { "没有对应的key" })
}
3.遍历
代码语言:javascript复制fun main() {
val map = mapOf("张三" to 8, "赵四" to 16, "王五" to 20)
map.forEach {
println("${it.key} ${it.value}")
}
map.forEach { (key, value) ->
println("$key $value")
}
}
4.可变Map
通过mutableMapOf创建,新增getOrPut获取元素,如果不存在,则存入
代码语言:javascript复制fun main() {
val map = mutableMapOf("张三" to 8, "赵四" to 16, "王五" to 20)
map.getOrPut("孙六") { 0 }
}