目录
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
- 系统自带的扩展函数
//输出结果:
修改完成
阿文2
fun 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用法不同,但是引用对象和返回方式是一模一样的