- by
kotlin 中的委托模式依靠by关键字,语法定义:
val/var 属性名:属性的数据类型 by 代理类
使用场景:
(1) 延迟加载属性(lazy property):属性值只在初次访问时才会计算
(2) 可观察属性(observable property):属性发生变化时,可以向监听器发生通知
(3) 将多个属性保存在一个map内,而不是保存在多个独立的域内 - lazy(延迟加载)
lazy()是一个函数, 接受一个Lambda表达式作为参数, 返回一个Lazy类型的实例,这个实例可以作为一个委托, 实现延迟加载属性(lazy property): 第一次调用 get() 时, 将会执行 lazy() 函数受到的Lambda 表达式,然后会记住这次执行的结果, 以后所有对 get() 的调用都只会简单地返回以前记住的结果.
val no: Int by lazy {
200
}
val c = 200
fun main(args: Array) {
val b = 200
println(no) // Log : 200
}
注:
(1) var类型属性不能设置为延迟加载属性,因为在lazy中并没有setValue(…)方法
(2)lazy操作符是线程安全的。如果在不考虑多线程问题或者想提高更多的性能,也可以使
- run
(1) 调用run函数块。返回值为函数块最后一行,或者指定return表达式
val a = run {
println("run")
return@run 3
}
println(a)
运行结果:
run
3
(2) 调用某对象的run函数,在函数块内可以通过 this 指代该对象。返回值为函数块的最后一行或指定return表达式
val a = "string".run {
println(this)
3
}
println(a)
运行结果
- apply
调用某对象的apply函数,在函数块内可以通过 this 指代该对象。返回值为该对象自己
val a = "string".apply {
println(this)
}
println(a)
运行结果:
string
string
- let
调用某对象的let函数,则该对象为函数的参数。在函数块内可以通过 it 指代该对象。返回值为函数块的最后一行或指定return表达式
val a = "string".let {
println(it)
3
}
println(a)
运行结果:
string
3
- also
调用某对象的also函数,则该对象为函数的参数。在函数块内可以通过 it 指代该对象。返回值为该对象自己
val a = "string".also {
println(it)
}
println(a)
运行结果:
string
string
- with
with函数和前面的几个函数使用方式略有不同,因为它不是以扩展的形式存在的。它是将某对象作为函数的参数,在函数块内可以通过 this 指代该对象。返回值为函数块的最后一行或指定return表达式
val a = with("string") {
println(this)
3
}
println(a)
运行结果:
string
3
参考:https://www.jianshu.com/p/a3e44ce16403
https://www.cnblogs.com/duduhuo/p/6934137.html
网友评论