快速上手 Kotlin 开发系列之集合操作符

Posted 张鹿鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速上手 Kotlin 开发系列之集合操作符相关的知识,希望对你有一定的参考价值。

本节接上一篇继续介绍 Kotlin 的集合操作符和如何自定义集合操作符。

通过上一节 Rxjava 的示例,我们把同样的功能使用 Kotlin 来实现。

Kotlin 示例

附上整体代码:

fun main() 
    val a = arrayOf("4", "0", "7", "i", "f", "w", "0", "9")
    val index = arrayOf(5, 3, 9, 4, 8, 3, 1, 9, 2, 1, 7)
    index
        .filter  it < a.size 
        .map  a[it] 
        .reduces, s1 -> "$s$s1" 
        .also  println("密码是:$it") 

首先还是声明两个数组,一个是作为参数输出的字符串数组,另外一个是下标数组。

之后就可以直接操作集合,而不是像 RxJava 一样经过 flatMap。

filter 等价于 RxJava 的 filter,过滤下标大于 String 数组的值。

 .filter  it < a.size 

map 等价于 RxJava 的 map,做一次数据类型变换。取出对应下标的元素。

.map  a[it] 

reduce 等价于 RxJava 的 reduce,做一次数据合并。这里使用 Kotlin 的模板字符串的方式将两字符串合并。

.reduces, s1 -> "$s$s1" 

最后,使用 also 输出结果,相当于 RxJava 的 subscribe。

.also  println("密码是:$it") 

我们首先直观上看,Kotlin 的代码量要远远小于 RxJava,这里面一个原因是 Kotlin 不需要 flatmap 操作符去做变换,第二个原因是 Kotlin 原生支持了 Lambda 表达式,所以我们不需要像 Java 一样每一个参数都去显式的 new 一个接口对象。

如果我们想有一个自定的集合操作符,该怎么做呢?

自定义集合操作符

其实 Kotlin 的所有操作符都是一个 inline 的扩展函数来实现的。

比如这里我们定一个 convert,它的功能实际上跟 map 的功能是一致的,将我们输入的参数转换成另外一种类型的数据输出,它扩展的是一个迭代器,也就是说我们所有的集合都可以使用这个扩展函数:

inline fun <T, E> Iterable<T>.convert(action: (T) -> E): MutableList<E> 
    val list: MutableList<E> = mutableListOf()
    for (item in this) list.add(action(item))
    return list


fun main() 
    val list: List<Int> = listOf(1, 2, 3, 4, 5)
    list.convert  it + 1 
        .forEach 
            print("$it ")
        

以上就是本节内容,欢迎大家关注~

以上是关于快速上手 Kotlin 开发系列之集合操作符的主要内容,如果未能解决你的问题,请参考以下文章

快速上手 Kotlin 开发系列之操作符

快速上手 Kotlin 开发系列之作用域函数

快速上手 Kotlin 开发系列之反引号

快速上手 Kotlin 开发系列之比较对象

快速上手 Kotlin 开发系列之循环

快速上手 Kotlin 开发系列之类型映射