Kotlin 第三讲——集合篇

avatar
Android @奇舞团Android团队
原文链接: mp.weixin.qq.com

内容简介:前文介绍了数据类型相关的文章,本讲我们来聊聊 Kotlin 中的集合。

简介

Kotlin 完全兼容 Java 的集合,且 Kotlin 有专有的集合:可变集合&不可变集合(本质还是 Java 的集合,后面讲到的类的映射大家就明白啦)。

不可变集合:集合在创建的时候,就知道元素的个数与内容。创建后不可以新增元素。
                        

    fun main() {

    /**

    * Kotlin 不可变集合

    * 都不带有 add 方法和 remove 方法

    *

    * 其实不可变的集合,就是给编译器看的.编译器不让你写 remove 方法,最终编译的 class 文件都映射成了 Java 的集合

    * Java 调用 Kotlin 的不可变集合,是可以调用到 remove 和 add 方法的

    */

    val listOf = listOf< String>("1" , "2", "3")

    val setof = setOf< String>("1" , "2", "3")

    val map = mapOf< String, Int >(Pair( "1", 1 ), Pair( "2", 2 ))

    /**

    * 注意:

    * 为啥可以用 to 连接呢?(后续讲到神奇的中缀符号,类似自定义操作符)

    */

    val mapof = mapOf( "1" to 1 , "2" to 3)

    }

补充一点:Kotlin 的不可变集合,在定义的时候就固定了元素个数与内容。这个限定范围只在 Kotlin 语言范围中(编辑器限制)。若 Java 调用 Kotlin 中的不可变集合,就会打破这个限制。(本质还是 Java 的集合)

可变结合:创建后可以新增元素。

    fun main() {

    /**

    * Kotlin 中的可变集合

    * 最终也是映射成 Java 的集合

    */

    val list = mutableListOf<String>("1", "2", "3")

    val mutableMapOf = mutableMapOf(1 to 2, 2 to 3)

    val mutableSetOf = mutableSetOf(1 , 3)

    /**

    * 当然 Kotlin 也可以直接使用 Java 的集合定义

    */

    val javaList = ArrayList<String>()

    val javaMap = HashMap<String, Int>()

    val javaSet = HashSet<String>()

    }

Kotlin 集合方法的封装

Kotlin 为我们扩展了好多方便操作集合方法,我们来看看常用的几个吧。

List 集合

取值:可直接通过索引获取

    fun main() {

    val javaList = ArrayList<String>()

    /**

    * 直接通过索引访问

    */

    val s = javaList[0]

    }

取区间:还记得 Kotlin 特有的区间吗?当我们想从 list 集合中取一个区间范围的时候,使用 slice 方法即可。

                            

    fun main() {

    val javaList = ArrayList<String >()

    /**

    * 取区间,当然也可以使用半开区间 until

    */

    val result = javaList.slice( 0..2 )

    }

List集合直接相加减:Kotlin List 集合可以运算啦!!! (大伙考虑下,怎么实现的呢?)

操作 解释
list1 + list2 最终结果,合并2个集合
list1 - list2 最终结果,list1 于 list2 的差集

    /**

    * 2个集合相加,得到第三个集合.

    * 2个集合相减,左边的集合删除右边集合中存在的元素

    */

    fun main() {

    /**

    * 这里我特意创建了2个不同类型的集合

    */

    val list = mutableListOf<String>("1", "2", "3")

    val javaList = ArrayList<String>()

    /**

    * 1个是 mutableList 一个是 ArrayList

    * 发现还可以相加,充分证明了,他俩有不可拆分的联系

    */

    val listAdd = list + javaList

    }

遍历丶转换丶过滤:Kotlin 提供了很多类似 RxJava 的操作符。

    fun main() {

    val javaList = ArrayList<String>()

    /**

    * 数据转换

    */

    javaList.map {

    }

    /**

    * 过滤

    */

    javaList.filter {

    }

    /**

    * flatMap转换

    */

    javaList.flatMap {

    }

    /**

    * 遍历

    */

    javaList.forEach {

    }

    /**

    * 索引+值遍历

    */

    javaList.forEachIndexed { index, s ->

    }

    }

删除元素:Kotlin 的 remove 方法是删除指定元素,removeAt 是按照索引删除,removeIf 可以条件删除。

    fun main() {

    val list= mutableListOf<String>()

    /**

    * 对象删除

    */

    list.remove("")

    /**

    * 索引删除

    */

    list.removeAt(0)

    /**

    * 条件删除

    */

    list.removeIf {

    }

    }

Map 集合

Map 集合在 Java 中是经常使用的集合。但是我不得不吐糟 Java 中 Map 集合遍历很恶心。Kotlin 做了很大的改变,接下来我们来瞧一瞧。

增加元素:增加元素可以直接使用 [],类似数组赋值的语法增加(取 key 的值,也支持此语法)。

    fun main() {

    /**

    * 创建可变 Map 并增加 2 个元素

    * 注意: 这里的增加元素是通过 key to value 的形式,后面会讲解这个 to 的原理

    */

    val mutableMap = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)

    /**

    * 新的增加元素方式,增加 key=阿花 value=12 的一个元素

    */

    mutableMap["阿花"] = 12

    }

删除元素

    fun main() {

    val mutableMap = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)

    mutableMap.remove("阿文")

    }

遍历丶转换丶过滤

    fun main() {

    val mutableMap = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)

    /**

    * map 转换

    */

    mutableMap.map {

    }

    /**

    * 过滤

    */

    mutableMap.filter {

    }

    /**

    * 遍历

    */

    mutableMap.forEach { key, value ->

    }

    /**

    * in 遍历

    */

    for (mutableEntry in mutableMap) {

    }

    /**

    * 这种形式的遍历和上面的 in 遍历方式是一致的

    * 为何可以这样写?后面讲到重载操作符会补充这里

    */

    for ((value, key) in mutableMap) {

    }

    }

总结

Kotlin 为集合提供了很多强大的辅助方法,实现原理都很简单。(都是对集合进行封装。其实这些功能全都归功于 Koltin 的扩展函数。期待我们的下一篇文章吧!)。

参考内容:

  • Reference - Kotlin 语言中文站 https://www.kotlincn.net/docs/reference/

推荐阅读

--END--

识别二维码,关注我们