Kotlin 能够扩展一个类的新功能而无需继承该类。 例如,你可以为一个你不能修改的来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用。 这种机制称为 扩展函数 。此外,也有 扩展属性, 允许你为一个已经存在的类添加新的属性。
在Kotlin中提供了大量的扩展,使得我们的代码更加简洁,开发出来的框架更加易用
一、扩展方法的使用
Kotlin的扩展函数可以让你作为一个类成员进行调用的函数。这样可以很方便的扩展一个已经存在的类,为它添加额外的方法。在Kotin源码中,有大量的扩展函数来扩展Java,这样使得Kotlin比Java更方便使用,效率更高。

- 在Kotlin中使用
Kotlin
class Jump{
fun test(){
println("jump test")
// 在被扩展的类中使用
doubleJump(1f)
}
}
// 扩展方法的定义,就是在方法的前面加上类前缀
fun Jump.doubleJump(value: Float) : Boolean{
println("value = $value")
return true
}
fun main() {
// 使用对象调用
val ju = Jump()
/// 外部调用 扩展
ju.doubleJump(2f)
}
- 在Java中使用
typescript
public class JavaLession {
public static void main(String[] args) {
/// 在Java中调用 Kotlin 的扩展
Lesson04Kt.doubleJump(new Jump(),1f)
}
}
二、泛型扩展方法
为了考虑到扩展函数的通用性,我们可以借助上面课程中学习到的泛型,来为扩展方法进行泛型化改造以 fun MutableList Int.swap(index1:Int,index2:Int)为例,接下来我们为它进行泛型化改造
kotlin
fun <T> MutableList<T>.jl_swap(index1: Int, index2: Int){
var tmp = this[index1]
this[index1] = this[index2]
this[index2] = tmp
}
fun main() {
val test2 = mutableListOf("Android o","Android N", "Android M")
test2.jl_swap(3,5)
}
三、为伴生对象添加扩展
如果一个类定义了伴生对象,那么我们也可以为伴生对象定义扩展函数与属性:
kotlin
class Jump{
companion object{
}
}
fun Jump.Companion.run(str: String){
println(str)
}
fun main() {
Jump.run("aa")
}
四、Kotlin中常用的扩展
在Kotlin的源码中定义了大量的扩展,比如: let,run ,apply ,了解并运用这些函数能帮我们提高编码效率。
- let扩展let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,那么let函数是一个不错的选择;let函数另一个作用就是可以避免写一些判断null的操作。
kotlin
// let扩展函数,类后面加上?代表参数可能为空,使用的时候注意判空
fun testLet(str: String?){
str.let {
var str2 = "let 扩展"
println(it + str2)
}
// str2 外部无法访问
// 判空用法,当str为空,则不会触发闭包里面的逻辑
str?.let {
println(it.length)
}
}
- run扩展 run函数只接收子个lambda函数为参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式,在run函数中可以直接访问实例的公有属性和方法。
kotlin
// 返回值为最后一行的值或者指定的return的表达式,在run函数中可以直接访问实例的公有属性和方法。
fun testRun(jump: Jump): String{
jump.run {
test()
println("ddd")
return "222"
}
}
- apply扩展apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。 从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值,而apply函数的返回的是传入对象的本身。
apply一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值。或者动态inflate出一个XML的View的时候需要给View绑定数据也会用到,这种情景非常常见。
kotlin
fun main() {
// apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。
// 从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值,
ArrayList<String>().apply {
add("dd")
add("333")
}.run {
for (s in this){
println(s)
}
}
}