目录
1、知识储备——扩展函数
原理
定义扩展函数
调用扩展函数
2、返回值为上下文对象的标准函数
apply
also
3、返回值为Lambda表达式结果
let
run
with
4、一表总结
1、知识储备——扩展函数
原理
Kotlin 在不继承父类或实现接口下,也能扩展一个类的新功能
定义扩展函数
fun 类A.扩展方法(参数):返回值类型 { }
调用扩展函数
val 新对象 = 类A()
val 获取返回值 = 新对象.扩展方法(传参数)
2、返回值为上下文对象的标准函数
apply
- 对象引用为this(可省略)
- 返回对象本身
- 系统自带的扩展函数
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")val result = StringBuilder().apply {append("Start eating fruits. \n")for (fruit in list) {append(fruit).append("\n")}append("Ate all fruits.")}
讲解:这里创建一个集合,StringBuilder对象创建后调用apply函数,StringBuilder相关方法直接调用即可,或this.方法名调用也可;最后这个对象整体返回给result变量
also
- 对象引用为it(可自定义,但是不可省略)
- 返回对象本身
- 系统自带的扩展函数
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")val result = StringBuilder().also {append("Start eating fruits. \n")for (fruit in list) {it.append(fruit).append("\n")}it.append("Ate all fruits.")}
//或者自定义引用val result = StringBuilder().also {temp->append("Start eating fruits. \n")for (fruit in list) {temp.append(fruit).append("\n")}temp.append("Ate all fruits.")}
讲解:与apply最大区别就是调用自身方法或属性,需要用it或自定义的名字来调用;最后也是将整体返回给result
3、返回值为Lambda表达式结果
let
- 引用对象为it
- 返回let函数最后一行非赋值语句值,否则返回Unit
- 系统自带的扩展函数
//letResult接收Unit
val letResult:Int? = book.let { bookEntry: Book ->bookEntry.changePrice(100)bookEntry.name = "letResult"
}//letResult接收100
val letResult:Int? = book.let { bookEntry: Book ->bookEntry.changePrice(100)bookEntry.name = "letResult"100
}
run
- 引用对象为this(可省略)
- 返回run函数最后一行非赋值语句值,否则返回Unit
- 系统自带的扩展函数
//输出结果: 修改完成 阿文2fun main() {val data = Data("阿文", 18)val reslut = data.run {name = "阿文2""修改完成"}println(reslut)println(data.name)
}
with
- 引用对象为this(可省略)
- 返回run函数最后一行非赋值语句值,否则返回Unit
- 非扩展函数
val withResult = with(book) {changePrice(300)name = "withResult"this //也可以把这个对象作为返回值
}
println("withResult $withResult")
讲解:和run用法不同,但是引用对象和返回方式是一模一样的