​ 集合可以方便你处理一组数据,也可以作为值参传给函数,和我们学过的其他变量类型一样,List、Set和Map类型的变量,也分为两种,只读和可变

List创建与元素获取

  • getOrElse是一个安全索引取值函数,它需要两个参数,第一个是索引值,,第二个是能提供默认值的lambda表达式,如果索引值不存在的话,可用来代替异常。

  • getOrNull是Kotlin提供的另一个安全索引取值函数,它返回null结果,而不是抛出异常

val list = listOf("Jack","Rose","Lee")
println(list.getOrElse(3) { "Unknown" }) // Unknown
println(list.getOrNull(3) ) // null
println(list.getOrNull(3) ?: "Unknown1") //Unknown1

可变列表

​ 在Kotlin中,支持内容修改的列表叫可变列表,要创建可变列表,可以使用mutableListOf函数。List还支持toList和toMutableList函数动态实现只读列表和可变列表的相互转换

val mutableList = mutableListOf("Jack", "Rose", "Lee")
mutableList.add("Jimmy")
mutableList.remove("Lee")
val toMutableList = list.toMutableList()

mutator函数

  • 能修改可变列表的函数有个统一的名字: mutator函数
  • 添加元素运算符与元素删除运算符(+= 、-=)
  • 基于lambda表达式指定的条件删除元素
val mutableList = mutableListOf("Jack", "Rose", "Lee")
mutableList += "Carl"
println(mutableList)
mutableList -= "Rose"
println(mutableList)
mutableList.removeIf { it.contains("J") }
println(mutableList)

集合遍历

  • for in 遍历
val list = listOf("Jack","Rose","Lee")
for (s in list) {
println(s)
}
  • forEach遍历
list.forEach{
println(it)
}
  • forEachIndexed遍历时要获取索引
list.forEachIndexed { index, s ->
println("$index,$s")
}

解构语法过滤元素

val list = listOf("Jack","Rose","Lee")
val (origin,_,proxy) = list

使用_ 符号过滤不需要的元素

Set创建与元素获取

  • 通过setOf创建set集合,使用elementAt函数读取集合中的元素
val set = setOf("Jack", "Rose", "Lee", "Jack")
println(set)
println(set.elementAt(2))

可变集合

通过mutableSetOf创建可变的set集合

val mutableSetOf = mutableSetOf("Jack", "Rose", "Lee", "Jack")
mutableSetOf.add("Jack")
mutableSetOf += "Chen"
println(mutableSetOf)

集合转换

  • 把List转成Set,去掉重复元素
val list = listOf("Jack", "Rose", "Lee", "Jack")
.toSet()
.toList()
println(list)
  • 快捷函数
val list = listOf("Jack", "Rose", "Lee", "Jack")
.distinct() //快速去重
println(list)

数组类型

Kotlin提供各种Array,虽然是引用类型,但是可以编译成Java基本数据类型

数组类型 创建函数
IntArray intArrayOf
DoubleArray doubleArrayOf
LongArray longArrayOf
ShortArray shortArrayOf
ByteArray byteArrayOf
FloatArray floatArrayOf
BooleanArray booleanArrayOf
Array arrayOf

Map集合

  • to看上去像关键字,但事实上,他是省略了点号和符号的特殊函数,to函数将它左边和右边的值转成一对Pair
val map = mapOf("Jack" to 20, "Jason" to 21, "Lee" to 30)
mapOf(Pair("Carl",20))

读取Map的值

  • [] 取值运算符,读取键对应的值,如果键不存在就返回null
  • getValue,读取键对应的值,如果键不存在就抛出异常
  • getOrElse,读取键对应的值,或者使用匿名函数返回默认值
  • getOrDefault,读取键对应的值,或者返回默认值
println(map["Lee"]) //30
println(map.getValue("Jason")) //21
println(map.getOrElse("Rose") { "Unknown" }) //Unknown
println(map.getOrDefault("Jira", 0)) //0

遍历

  • forEach遍历Map
val map = mapOf("Jack" to 20, "Jason" to 21, "Lee" to 30)
map.forEach{ // it:Map.Entry<String,Int>
println("${it.key}, ${it.value}")
}

map.forEach {(key,value) ->
println("$key, $value")
}

可变集合

  • 通过mutableMapOf创建可变的Map
  • getOrPut键值不存在,就添加并返回结果,否则就返回已有键对应的值
val mutableMap = mutableMapOf("Jack" to 20, "Jason" to 21, "Lee" to 30)
mutableMap += "Lisa" to 16
mutableMap.put("Jimmy",22)
mutableMap["Chris"] = 28
mutableMap.getOrPut("Rose"){ 18 }
println(mutableMap)