以上是 Kotlin 的集合接口关系,从上到下,依次下面继承(或实现)上面的接口。

    所有类声明的泛型尖括号里面如果加入了 关键字,则说明这个类的对象是只读的,例如他只有:get()、size()等方法,而没有 set()、remove()等方法。

    相反的,如果没有加 out 关键字,或者换一种记法:如果开头是 MutableXXX 那就是一个跟 Java 中用法一致的集合类。

    2. in 与 out

    至此,你应该已经知道 out 关键字的含义了,与 out 对应的,还有一个 in。表示泛型参数是只写的。

    泛型的 in 关键字一般用在我们定义的代码中。 在看下面这个 demo 之前,你需要知道一点:Kotlin 的泛型是支持协变的。例如下面这段代码:

    1. open class A
    2. open class B : A()
    3. open class C : B()
    4. class TypeArray<in A> {
    5. //in 修饰了 A,表示 A 是可以作为参数的。
    6. return a?.hashCode()
    7. }
    8. //这段代码是非法的,因为A 不能被返回
    9. return a
    10. }
    11. }

    在 Kotlin 中,集合类一般不使用构造方法去初始化,而是使用统一的入口方法,例如初始化一个 MutableList,我们使用的是如下代码:

    类似的初始化集合对象的方法还有

    1. //创建一个 List<> 对象
    2. var list = listOf(0, 1, 2)
    3. //创建一个 Set<> 对象
    4. val ss = setOf(1, 2, 4)

    还有很多,可以在 kotlin.collections.Collections.kt文件中查看。

    有一点需要知道的是,这些方法的返回值实际上返回的是 Java 的集合对象,目前只支持返回这些对象:

    其他的对象,目前还不支持,比如 LinkedList,个人觉得这个对象还是很常用的,不知道为什么没有方法提供,所以目前这类对象还是只能用构造方法去创建。

    4. 操作符

    Kotlin 中,操作符是用来对数据做操作的工具方法。
    如果你使用过 RxJava 等一系列库,你一定会对操作符非常了解也对操作符的强大深有感触。
    Kotlin 原生支持大量操作符,文尾将会列出常用操作符及含义。 这两幅图是我上周在《从 Java 到 Kotlin,当机器人不再喝咖啡》 技术分享时 PPT 中的两页,代码运行后是当时会场的 WiFi 密码,大家可以感受一下用 Kotlin 和 Java 实现的对比。

    kotlin 集合类

    以最简单也是最常用的一个操作符 forEach 举例。

    1. }

    在 Kotlin 中,操作符本质上是方法调用。例如 List 的 forEach 的实现原理实际上是定义了一个这样的方法。为 Iterable 增加了一个扩展方法,叫 forEach,它接收一个 T 作为参数,并返回 Unit 的闭包作为参数。

    而内部,实际上就是 for 循环对每一个对象调用传入的参数方法。

    所以,我们也可以很轻松的通过这样的特性实现自己的自定义操作符。例如下面的代码为一个 List 添加一个转换操作符,可以将 List<A> 转换成 List<B>,其中 A 和 B 可以为任何类型。

    1. inline fun <T, E> Iterable<T>.convert(action: (T) -> E): MutableList<E> {
    2. val list: MutableList<E> = mutableListOf()
    3. for (element in this) list.add(action(element))
    4. return list
    5. }
    6. {
    7. val list: List<String> = listOf("hello","world")
    8. list.convert {
    9. it.hashCode()
    10. }.forEach {
    11. print("$it")

    这样子就可以直接调用 list 的 convert 方法,只需要实现转换逻辑,就可以了。

    6. 常用操作符

    下标操作类
    • contains —— 判断是否有指定元素
    • elementAt —— 返回对应的元素,越界会抛IndexOutOfBoundsException
    • firstOrNull —— 返回符合条件的第一个元素,没有 返回null
    • lastOrNull —— 返回符合条件的最后一个元素,没有 返回null
    • indexOf —— 返回指定元素的下标,没有 返回-1
    • singleOrNull —— 返回符合条件的单个元素,如有没有符合或超过一个,返回null
    判断类
    • any —— 判断集合中 是否有满足条件 的元素
    • all —— 判断集合中的元素 是否都满足条件
    • none —— 判断集合中是否 都不满足条件,是则返回true
    • count —— 查询集合中 满足条件 的 元素个数
    • reduce —— 从 第一项到最后一项进行累计
    过滤类
    • filter —— 过滤 掉所有 满足条件 的元素
    • filterNot —— 过滤所有不满足条件的元素
    • filterNotNull —— 过滤NULL
    • take —— 返回前 n 个元素
    转换类
    • map —— 转换成另一个集合(与上面我们实现的 convert 方法作用一样);
    • mapIndexed —— 除了转换成另一个集合,还可以拿到Index(下标);
    • mapNotNull —— 执行转换前过滤掉 为 NULL 的元素
    • flatMap —— 自定义逻辑合并两个集合;
    • groupBy —— 按照某个条件分组,返回Map;
    排序类
    • reversed —— 反序
    • sorted —— 升序
    • sortedBy —— 自定义排序