定义扩展函数
扩展可以在不直接修改类定义的情况下增加类功能,扩展可以用于自定义类,也可以用于比如 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。
带接收者的函数字面量
apply 函数是如何做到支持接收者对象的隐式调用的。
使用这样的编程范式,就可以写出业界知名的“领域特定语言”(DSL),一种 API 编程范式,暴露接收者的函数和特性,以便于使用你定义的 lambda 表达式来读取和配置它们。?