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

本节接上一篇继续介绍 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] }
        .reduce{s, 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 的模板字符串的方式将两字符串合并。

.reduce{s, 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 ")
        }
}

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

长按关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值