Kotlin之集合

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

集合的种类和写法

一提到集合,那么大家不由自主的想到ListSetMap。没错,在Kotlin中也包含了这三类集合。

  • List:可能是最流行的集合类型。他是一个有序的集合,正因为它的有序,我们可以使用get函数通过position来访问。

  • Set:一个无序并不重复item的集合。

  • Map:一个以键值对"key-value"形式存在的集合。key在map中是唯一的,也就是说不能有两对key样的键值对存在于一个map中。


介绍了三中集合的概念之后,我们来看看它们在Kotlin里的写法,和Java有所不同:


1
fun main(args: Array<String>) {
2 val list = listOf<Int>(1234)
3 val set = setOf<Int>(1234)
4 val map = mapOf<Int, String>(1 to "a"2 to "b"3 to "c")
5 println(list)
6 println(set)
7 println(map)
8}
9// 输出
10// [1, 2, 3, 4]
11// [1, 2, 3, 4]
12// {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():取集合中最大值

    1 fun main(args: Array<String>) {
    2 val list = listOf(1234)
    3 println(list.max())
    4}
    5// 4
  • last:返回集合中最后一个元素

  • 1fun main(args: Array<String>) {
    2 val list = listOf(1234)
    3 println(list.last())
    4}
    5// 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:遍历集合中每一个元素,并且对这些元素进行给定函数处理后返回到一个新集合中

  • 1fun main(args: Array<String>) {
    2 val list = listOf(1234)
    3 // 对每一个元素加1
    4 println(list.map { it + 1 })
    5}
    6// [2, 3, 4, 5]
  • all:如果全部的元素都符合函数内条件,则返回true

  • 1fun main(args: Array<String>) {
    2 val list = listOf(1234)
    3 // 判断集合中元素是否都大于2
    4 println(list.all { it > 2 })
    5}
    6// false
  • any:如果集合中有一个或一个以上的元素满足函数内条件,则返回true

  • 1fun main(args: Array<String>) {
    2 val list = listOf(1234)
    3 // 判断集合中是否存在大于2的元素
    4 println(list.any { it > 2 })
    5}
    6// true
  • count:返回符合函数内条件的元素个数

    fun main(args: Array<String>) { val list = listOf(1, 2, 3, 4) // 计算集合中大于2的元素个数 println(list.count { it > 2 }) } // 2

  • groupBy:将集合按照函数内条件分组

  •  1class Person(val name: String, val age: Int) {
    2 override fun toString(): String {
    3 return "Person(name='name,age¨E61E<annotation encoding="application style="box-sizing: border-box;font-size: inherit;color: rgb(238, 220, 112);line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;" span="" class="hljs-string" age="<span class="katex-html" aria-hidden="true" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="strut" style="height:0.946332em;vertical-align:-0.19444em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="mord mathit" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">n<span class="mord mathit" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">a<span class="mord mathit" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">m<span class="mord mathit" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">e<span class="vlist" style="height:0.751892em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span style="top:-3.063em;margin-right:0.05em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="pstrut" style="height:2.7em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="sizing reset-size6 size3 mtight" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="mord mtight" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="mord mtight" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">,<span class="mspace" style="margin-right:0.16666666666666666em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;"><span class="mord mathit" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">a<span class="mord mathit" style="margin-right:0.03588em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">g<span class="mord mathit" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">e¨<span class="mord mathit" style="margin-right:0.05764em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">E61<span class="mord mathit" style="margin-right:0.05764em;" style="box-sizing: border-box;font-size: inherit;color: inherit;line-height: inherit;word-wrap: inherit !important;word-break: inherit !important;">Eage)"
    4 }
    5}
    6
    7fun main(args: Array<String>) {
    8 val persons = listOf(Person("ming"22), Person("hong"21), Person("tao"22))
    9 // 对persons按照年龄相同分组
    10 println(persons.groupBy { it.age })
    11}
    12// {22=[Person(name='ming', age=22), Person(name='tao', age=22)], 
    13// 21=[Person(name='hong', age=21)]}
    14</span class="mord mathit" style="margin-right:0.05764em;"></span class="mord mathit" style="margin-right:0.05764em;"></span class="mord mathit"></span class="mord mathit" style="margin-right:0.03588em;"></span class="mord mathit"></span class="mspace" style="margin-right:0.16666666666666666em;"></span class="mord mtight"></span class="mord mtight"></span class="sizing reset-size6 size3 mtight"></span class="pstrut" style="height:2.7em;"></span style="top:-3.063em;margin-right:0.05em;"></span class="vlist" style="height:0.751892em;"></span class="mord mathit"></span class="mord mathit"></span class="mord mathit"></span class="mord mathit"></span class="strut" style="height:0.946332em;vertical-align:-0.19444em;"></span class="katex-html" aria-hidden="true"></annotation encoding="application>

    从打印结果可以看到,年龄为22的分在一个组合中,21则存在于另外一个组合

除了上面介绍的一些扩展函数之外,Kotlin还提供了很多额外的函数,如:flatMapfirstsort等等一系列,大家可以去Kotlin文网站上面仔细学习,这些函数可以在日常开发中带来很便捷的操作。

这期笔者就为大家带来这些内容,还有很多没介绍,希望大家可以自己去网站上学习。


写在最后

每个人不是天生就强大,你若不努力,如何证明自己,加油!

Thank You!

--Taonce

如果你觉得这篇文章对你有所帮助,那么就动动小手指,长按下方的二维码,关注一波吧~~

Kotlin之集合
专注Kotlin的公众号


原文始发于微信公众号(Taonce):Kotlin之集合