inline
关键字,内敛函数
inline fun log(text: String){
println(text)
}
当调用log
函数的时候,就相当于把log
函数里面的代码完全复制到了调用log
函数的方法里。
在函数中传入函数类型的参数
class View{
fun setOnClickListener(listener: (View) -> Unit){
}
}
fun main (){
val view = View()
view.setOnClickListener(::onClick)
}
fun onClick(view: View){
println("被点击了")
}
在上面的代码中
::onClick
表示把方法的引用传递过去,定义函数类型参数的时候第一个参数为输入类型,第二个是输出类型。
inline
关键字更适合传入类型是函数的时候使用,因为如果加上inline
的话,是在调用的函数里面把代码复制过去。而去掉inline
之后,调用的时候相当于是传入一个对象,这样频繁调用的话,就会生成多个对象。
只创建一个对象
private val lessonPresenter = LessonPresenter()
fun getPresenter(): LessonPresenter {
return lessonPresenter
}
也可以在接口中创建一个抽象属性:
interface BaseView<T>{
val presenter: T
}
实现baseview
的类可以返回一个presenter
对象:
private val lessonPresenter = LessonPresenter()
override val presenter: LessonPresenter?
get() = lessonPresenter
使用委托创建
ovrride val presenter: LessonPresenter? by lazy {
LessonPresenter()
}
加上
by lazy
后表示里面只会调用一次,并且在用到这个属性的时候才会调用,如果用不到也不会调用。
使用委托来管理对象
var token: String by Saver("token")
class Saver(var token: String){
operator fun getValue(.......){
return xxxx;
}
operator fun setValue(....){
做set操作
}
}
这样每次修改token的值就会调用set方法。
其他操作符
- 使用apply操作符,并返回调用本身:
private val paint = Paint().apply{ style = Paint.Style.STROKE }
- 使用let操作符,并返回最后一行:
一般使用let操作符更适合和判null一起。
总结:run和apply作用域都是this,apply返回的是自身。let和also作用域都是it,also返回的是自身。