本节接上一篇继续介绍 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 ")
}
}
以上就是本节内容,欢迎大家关注~