Kotlin入门笔记四:集合
![](https://img.haomeiwen.com/i6297937/397f8f5f6b414591.jpeg)
集合的种类和写法
一提到集合,那么大家不由自主的想到List、Set、Map。没错,在Kotlin中也包含了这三类集合。
-
List:可能是最流行的集合类型。他是一个有序的集合,正因为它的有序,我们可以使用get函数通过position来访问。
-
Set:一个无序并不重复item的集合。
-
Map:一个以键值对"key-value"形式存在的集合。key在map中是唯一的,也就是说不能有两对key样的键值对存在于一个map中。
介绍了三中集合的概念之后,我们来看看它们在Kotlin里的写法,和Java有所不同:
fun main(args: Array<String>) {
val list = listOf<Int>(1, 2, 3, 4)
val set = setOf<Int>(1, 2, 3, 4)
val map = mapOf<Int, String>(1 to "a", 2 to "b", 3 to "c")
println(list)
println(set)
println(map)
}
// 输出
// [1, 2, 3, 4]
// [1, 2, 3, 4]
// {1=a, 2=b, 3=c}
Kotlin中定义一个集合不需要像Java那么繁琐,如果在定义的时候你明确了集合中的类型,你甚至都可以不需要声明集合中数据的类型,如val list = listOf(1,2,3,4)
。
这里需要注意的是Map集合,通过Map的源码public fun <K, V> mapOf(vararg pairs: Pair<K, V>)
可以看出,mapOf
传入的参数其实是Pair(K,V)
,所以我们可以在声明Map集合的时候传入一个个Pair
,如:val map = mapOf<Int, String>(Pair(1, "a"), Pair(1, "a"), Pair(1, "a"))
,但是这种写法太冗余了,Kotlin中还可以通过to
函数来生成一个Pair
对象,写法为val map = mapOf<Int, String>(1 to "a", 2 to "b", 3 to "c")
,其实1 to "a"
就等同与Paid(1,"a")
,但是从肉眼上就能看出to
函数的写法要简单多了。所以推荐大家以后再声明键值对类型的常量,使用to
函数来声明。
集合的扩展函数
Kotlin给开发者提供了很多方便的扩展函数,如:
-
max():取集合中最大值
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) println(list.max()) } // 4
-
last:返回集合中最后一个元素
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) println(list.last()) } // 4
除了
last()
之外,还有其它一些类似的函数,如lastIndexOf(T)
,返回最后一个匹配T的index。更多的大家可以去官网的API了解,在这笔者就不过多介绍了。 -
filter:遍历集合并选出符合条件的元素
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) println(list.filter { it % 2==0 }) } // [2, 4]
list.filter { it % 2==0 }
这是一个Lambda表达式,在接下来笔者会带着大家一起学习,在这里暂不多介绍,只需要知道it
代表的是遍历集合的每一个元素。从输出结果中可以看出,集合中满足除以2取余为0的都打印出来了,用了filter
函数之后,就不需要大家手动去遍历集合,判断,最后打印了。 -
map:遍历集合中每一个元素,并且对这些元素进行给定函数处理后返回到一个新集合中
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 对每一个元素加1 println(list.map { it + 1 }) } // [2, 3, 4, 5]
-
all:如果全部的元素都符合函数内条件,则返回
true
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 判断集合中元素是否都大于2 println(list.all { it > 2 }) } // false
-
any:如果集合中有一个或一个以上的元素满足函数内条件,则返回
true
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 判断集合中是否存在大于2的元素 println(list.any { it > 2 }) } // true
-
count:返回符合函数内条件的元素个数
fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 计算集合中大于2的元素个数 println(list.count { it > 2 }) } // 2
-
groupBy:将集合按照函数内条件分组
class Person(val name: String, val age: Int) { override fun toString(): String { return "Person(name='$name', age=$age)" } } fun main(args: Array<String>) { val persons = listOf(Person("ming", 22), Person("hong", 21), Person("tao", 22)) // 对persons按照年龄相同分组 println(persons.groupBy { it.age }) } // {22=[Person(name='ming', age=22), Person(name='tao', age=22)], // 21=[Person(name='hong', age=21)]}
从打印结果可以看到,年龄为22的分在一个组合中,21则存在于另外一个组合
除了上面介绍的一些扩展函数之外,Kotlin还提供了很多额外的函数,如:flatMap
、first
、sort
等等一系列,大家可以去Kotlin文网站上面仔细学习,这些函数可以在日常开发中带来很便捷的操作。
这期笔者就为大家带来这些内容,还有很多没介绍,希望大家可以自己去网站上学习。下期笔者将为大家带来Kotlin中的修饰符。
写在最后
每个人不是天生就强大,你若不努力,如何证明自己,加油!
Thank You!
--Taonce