Kotlin入门笔记四:集合

作者: Taonce | 来源:发表于2018-09-28 23:17 被阅读36次
kotlin.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还提供了很多额外的函数,如:flatMapfirstsort等等一系列,大家可以去Kotlin文网站上面仔细学习,这些函数可以在日常开发中带来很便捷的操作。

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


写在最后

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

Thank You!

--Taonce

相关文章

网友评论

    本文标题:Kotlin入门笔记四:集合

    本文链接:https://www.haomeiwen.com/subject/iobmoftx.html