Android---Kotlin 学习011

扩展函数

定义扩展函数

扩展可以在不直接修改类定义的情况下增加类功能,扩展可以用于自定义类,也可以用于比如 List、String,已经 Kotlin 标准库里的其它类。和继承相似,扩展也能共享类行为,在你无法接触某个类定义,或者某个类没有使用 open 修饰符,导致你无法继承它时,扩展就是增加类功能的最后选择。

示例:给 String 增加一个我们自定义的函数 addExt()

后面所有的字符串都会有这个 addExt() 扩展函数。

超类(Any)上定义扩展函数,那么所有的类都会有这个扩展函数。

注意:如果扩展函数是私有的(private),那么只有在当前类里能使用。

泛型扩展函数

新的泛型扩展函数不仅可以支持任何类型的接收者,还保留了接收者的类型信息,使用泛型类型后,扩展函数能够支持更多类型的接收者,适用范围更广。

为了解决这个问题,那么我们可以通过泛型扩展函数来完成。

泛型扩展函数在 Kotlin 标准库里随处可见,例如 let 函数,let 函数被定义成了泛型扩展函数,所以能支持任何类型,它接收一个 lambda 表达式,这个 lambda 表达式接收者 T 作为值参,返回的 R-lambda 表达式返回的任何新类型。

扩展属性

除了给类添加功能扩展函数外,你还可以给类定义 扩展属性,给 String 类添加一个扩展,这个扩展属性可以统计字符串里有多少个元音字母。

示例:

可空类扩展

也可以定义扩展函数用于可空类型,在可空类型上定义扩展函数,你就可以直接在扩展函数体内解决可能出现的空值问题。

infix 关键字

infex 关键字适用于有单个参数的扩展类函数,可以让你以更简洁的语法调用函数。如果一个函数定义使用了 infix 关键字,那么调用它时,接收者和函数之间的点操作以及参数的一对括号都可以不要

定义扩展文件

扩展函数需要在多个文件里面使用,可以将它定义在单独的文件,然后 Import。

示例:定义一个扩展文件

在其它文件里使用 com.HL.extension.randomTake 这个扩展文件

重命名扩展文件

有时候,你想使用一个扩展或一个类,但它的名字不合你意。用 as 关键字。

Kotlin 标准库中的扩展

Kotlin 标准库提供的很多功能都是通过扩展函数和扩展属性来实现的,包含类扩展的标准库文件通常都是以类名加 s 后缀来命名的,例如 Sequences.kt,Ranges.kt,Maps.kt。

DSL

带接收者的函数字面量

apply 函数是如何做到支持接收者对象的隐式调用的。

使用这样的编程范式,就可以写出业界知名的“领域特定语言”(DSL),一种 API 编程范式,暴露接收者的函数和特性,以便于使用你定义的 lambda 表达式来读取和配置它们。