集合可以方便我们处理一组数据,也可以作为值参传递给函数,和我们学过的其他变量类型一样,List、Set和Map类型的变量也分为两类,只读和可变。
List
创建与获取元素
使用 listOf创建给定元素的只读list,使用 mutableListOf创建可变list。并且可以同 toList和toMutableList函数实现只读列表和可变列表的相互转换。
getOrElse是一个安全索引取值函数,它需要两个参数,第一个是索引值,第二个是能提供默认值的lambda表达式,如果索引值不存在的话,可用来代替异常。
getOrNull是Kotlin提供的另外一个安全索引取值函数,当索引值不存在时,它返回null,而不是抛出异常。
fun main() {
val names1 = listOf("Honey", "Luffy", "Kitty")
//println(names1[3])//会抛异常:java.lang.ArrayIndexOutOfBoundsException
val names2 = names1.toMutableList()
names2.add("Jim")
println(names2[3])
println(names2.get(3))//与names2[3]是一样的
println("names中的第3号元素:${names2.getOrElse(3) { "Index out of bounds" }}")
println("names中的第4号元素:${names2.getOrElse(4) { "Index out of bounds" }}")
val names3 = mutableListOf("Honey", "Luffy", "Kitty")
names3.add("Jack")
names3.add("Lucky")
println("names中的第2号元素:${names3.getOrNull(2) ?: "Index out of bounds"}")
println("names中的第5号元素:${names3.getOrNull(5) ?: "Index out of bounds"}")
}
mutator函数
能修改可变列表的函数统称为 mutator函数。
import java.util.function.Predicate
fun main() {
val names1 = mutableListOf("Honey", "Luffy")
names1 += "Kitty"//添加元素运算符
println("names1 = $names1")
names1.add("Jim")
println("names1 = $names1")
names1 -= "Kitty"//删除元素运算符
println("names1 = $names1")
names1.remove("hh")
println("names1 = $names1")
names1.removeIf {names1.contains("aa")}
println("names1 = $names1")
}
遍历集合
可以通过for in、forEach、forEachIndexed遍历集合。
fun main() {
val names1 = mutableListOf("Honey", "Luffy", "Jim")
for (name in names1) {
println(name)
}
println("---------------------------------")
names1.forEach { println("$it") }
println("---------------------------------")
names1.forEachIndexed { index, name -> (println("$index,$name")) }
}
解构
通过下划线“_”过滤不想要的元素。
fun main() {
val names1 = listOf("Honey", "Luffy", "Jim")
val (origin, proxy, _) = names1
println("origin = $origin,proxy = $proxy")
}
我们反编译一下就会发现,list的第三个元素没有赋值给任何变量:
Set集合
Set的创建与List比较相似,使用setOf和mutableSetOf分别可以创建不可变Set和可变Set,通过elementAt取指定索引的值。跟Java中一样,Set集合不允许有重复的元素。
fun main() {
val names1 = setOf("Honey", "Luffy", "Jim", "Honey")
//names1[1] //Set没有这种写法
println("names1 = $names1")
val names2 = mutableSetOf("Honey", "Luffy", "Jim")
names2 += "Honey"
println("names2 = $names2")
//通过elementAt取指定索引的值
println("name2的一号元素:${names2.elementAt(0)}")
}
集合转换
把 List通过 toSet函数转换成 Set,去掉重复元素之后,再把 Set转成 List。Kotlin提供了一个更快捷的函数 distinct可实现 List的去重。
fun main() {
val names = listOf("Honey", "Luffy", "Kitty", "Luffy", "Kitty", "Jack", "Honey", "Lucky", "honey")
val newNames = names.toSet().toList()
println("newNames = $newNames")
//去重快捷函数
val distinctNames = names.distinct()
println("distinctNames = $distinctNames")
}
数组类型
Kotlin提供了好多数组类型,虽然是引用类型,但可以编译成Java基本数据类型。
fun main() {
val intArray1 = intArrayOf(6, 8, 520, 1314)
print("intArray1 = ")
intArray1.forEach { print("$it,") }
println()
val intList = listOf(5, 6, 8)
println("intList = $intList")
val intArray2 = intList.toIntArray()
print("intArray2 = ")
intArray2.forEach { print("$it,") }
println()
val names = listOf("Honey", "Luffy", "Kitty")
println("names = $names")
val namesArray = names.toTypedArray()
print("intArray1 = ")
namesArray.forEach { print("$it,") }
}
Map集合
通过 mapOf创建Map集合,用 to创建键值对,to看上去像关键字,但事实上,它是省略了点号和参数的特殊函数,to函数将它的左边和右边的值转化成了Pair类型。
fun main() {
//创建map的两种方式
val stuInfo = mapOf("Honey" to 17, "Luffy" to 21, "Kitty" to 6)
val stuInfo2 = mapOf(Pair("Honey", 17), Pair("Luffy", 21), Pair("Kitty", 6))
//取值
println(stuInfo["Honey"])
println(stuInfo.getValue("Luffy"))
println(stuInfo.getOrElse("Jim") { "Unknown" })
println(stuInfo.getOrDefault("Lucky", -1))
}
遍历map
fun main() {
val stuInfo = mapOf("Honey" to 17, "Luffy" to 21, "Kitty" to 6)
stuInfo.forEach { println("${it.key},${it.value}") }
println("*********")
stuInfo.forEach { (name, age) -> println("$name,$age") }
}
可变集合
通过 mutableMapOf创建可变Map。
getOrPut函数表示当键值对不存在时,添加并返回结果,否则就返回已有的键值对。
fun main() {
val stuInfo = mutableMapOf("Honey" to 17, "Luffy" to 21, "Kitty" to 6)
stuInfo += "Franck" to 28
val age = stuInfo.getOrPut("Lucky") { 8 }
println(age)
println(stuInfo)
}