Kotlin-集合篇

972 阅读4分钟

第二讲 集合篇

前介

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

不可变集合

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

fun main() {
    /**
     * Kotlin 不可变集合 (纯属自淫)
     * 都不带有 add 方法和 remove 方法
     *
     * 为何说自淫呢? 其实不可变的集合,就是给编译器看的.编译器不让你写 remove 方法,最终编译的 class 文件都映射成了 java 的集合
     */
    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>()
     /**
      * 发现还可以相加,充分证明了,他俩有不可拆分的联系
      */
     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 mutableMapOf = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)
    /**
     * 新的增加元素方式,增加 key=阿花 value=12 的一个元素
     */
    mutableMapOf["阿花"] = 12
}

删除元素

fun main() {
    val mutableMapOf = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)
    mutableMapOf.remove("阿文")
}

遍历丶转换丶过滤

fun main() {
    val mutableMapOf = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)
    /**
     * map 转换
     */
    mutableMapOf.map {
    }
    /**
     * 过滤
     */
    mutableMapOf.filter {
    }
    /**
     * 遍历
     */
    mutableMapOf.forEach { key, value ->

    }
    /**
     * in 遍历
     */
    for (mutableEntry in mutableMapOf) {

    }
    /**
     * 这种形式的遍历和上面的 in 遍历方式是一致的
     * 为何可以这样写?后面讲到重载操作符会补充这里
     */
    for ((value, key) in mutableMapOf) {

    }
}

总结

Kotlin 为集合提供了很多强大的辅助方法,实现原理都很简单。(都是对集合进行封装。其实这些牛B多功能全都归功于,koltin 的扩展函数)

参考文献

更多内容

博客地址