Kotlin的集合是让我为之心动的地方,丰富的高阶函数帮助我们高效开发。今天介绍Kotlin的基础集合用法、获取集合元素的函数、过滤元素的函数、元素排序的函数、元素统计的函数、集合元素映射的函数、集合的交差并补集的函数。还有一些工作中的经验。
集合简介和Java集合不同的是,Kotlin的集合分可变和不可变两种集合。同时也支持两种集合相互切换。
List集合 // 声明并初始化不可变List集合 val list: List<Any> = listOf<Any>(1, "2", 3) // 声明并初始化可变MutableList集合 val mutableList: MutableList<Any> = mutableListOf<Any>(4, "5", 6) mutableList.add("7") list.map { print("$it \t") } mutableList.map { print("$it \t") } Set集合 // 声明并初始化不可变Set集合 val set: Set<Any> = setOf<Any>(1, "2", 3, "3") // 声明并初始化可变MutableSet集合 val mutableSet: MutableSet<Any> = mutableSetOf<Any>(4, "5", 6) mutableSet.add(6) set.map { print("$it \t") } mutableSet.map { print("$it \t") } Map集合 // 声明并初始化不可变Map集合 val map: Map<String, Any> = mapOf("k1" to "v1" , "k2" to 3) // 声明并初始化可变MutableMap集合 val mutableMap: MutableMap<String, Any> = mutableMapOf("k1" to "v1" , "k1" to 3) map.map { println("key : ${it.key} \t value : ${it.value}") } mutableMap.map { println("key : ${it.key} \t value : ${it.value}") } 集合函数 获取集合元素用Java语言开发时,我们通常用循环遍历集合的每个元素。有时候也会通过下标直接获取指定元素。此时原则上时需要我们先考虑集合元素的长度,以避免下标越界的异常问题。但往往我们会抱着侥幸的心态直接通过get(index)方法获取元素。一般情况下我们会在黑盒自测中发现越界问题(有部分朋友从不黑盒,直接白盒测试,并反问:测试的工作难道不就是发现问题?)。即便是在运行中出现越界问题,也可以甩锅给数据库。但不管怎么样,因为越界导致系统不稳定是不合理的。
用Kotlin语言开发时,我们会发现有很多带有"Or"字样的方法。比如我常用的getOrElse,firstOrNull 等方法。分别表示:通过下标如果没有获取到值,则返回自定的值。和获取集合的第一个元素,若集合为空则返回null。正因为Kotlin提供了很多类似getOrElse,firstOrNull 的方法。很大程度上提高了我们的开发效率,和减少了一些低级错误发生的概率。接下来我们学习一下Kotlin具体有哪些获取集合元素的方法(single方法没怎么用过)
常用函数get(index) : List的函数,通过下标获取指定元素。若找不到值(下标越界),会抛出IndexOutOfBoundsException异常
getOrElse(index, {...}) : List的扩展函数,通过下标获取指定元素。找不到值则返回默认值
getOrNull(index) : List的扩展函数,通过下标获取指定元素。找不到值则返回null
elementAtOrElse(index, {...}) : Iterable接口的扩展函数,功能同getOrElse 方法
elementAtOrNull(index) : Iterable接口的扩展函数,功能同getOrNull 方法
注意get方法是List独有,其他集合可以用element方法。
first() : 获取集合第一个元素。若没有返回值,则抛出NoSuchElementException异常
first{} : 获取集合中指定元素的第一个元素。若没有返回值,则抛出NoSuchElementException异常
firstOrNull() : 获取集合第一个元素。若没有返回值,返回null
firstOrNull{} : 获取集合指定元素的第一个元素。若没有返回值,返回null
看到这里,是不是有点明白Kotlin获取元素的规则:如果没有则怎么样
last() : 与first()相反
last{} : 与first{}相反
lastOrNull{} : 与firstOrNull()相反
lastOrNull() : 与firstOrNull{}相反
indexOfFirst{...} : 返回集合中第一个满足条件元素的下标
indexOfLast{...} : 返回集合中最后一个满足条件元素的下标
咋也不知道single方法设计的初衷,咋也不敢问
single() : Returns the single element, or throws an exception if the collection is empty or has more than one element. 官方api文档地址
single{} : 按照条件返回单个元素,若集合为空或者有多个元素满足条件,则报错
singleOrNull() : 返回单个元素,若集合为空或者有多个元素,则返回null
singleOrNull{} : 按照条件返回单个元素,若集合为空或者有多个元素满足条件,则返回null
使用建议在使用获取元素的方法时,推荐方法名中带有"Or"字样的方法,可以减少很多不必要的报错。
List集合通过下标获取元素可以用get,getOrElse,getOrNull函数,但其他集合没有这些方法。
笔者单方面认为single函数和数据库的唯一约束的功能有点类似,在使用Kotlin的过程中,你会发现它有很多和数据库类似的功能。
基础用法 val list: MutableList<Int> = mutableListOf(1,2,3,4,5) println("getOrElse : ${list.getOrElse(10,{ 20 })}") println("getOrNull : ${list.getOrNull(10)}") println("firstOrNull : ${list.firstOrNull()}") println("firstOrNull : ${list.firstOrNull { it > 3 }}") println("indexOfFirst : ${list.indexOfFirst { it > 3 }}") println("indexOfLast : ${list.indexOfLast { it > 3 }}") ----------------------------------------------------- getOrElse : 20 getOrNull : null firstOrNull : 1 firstOrNull : 4 indexOfFirst : 3 indexOfLast : 4 集合元素排序