工作生活

kotlin学习3

2019-07-08  本文已影响0人  思思入扣
  1. by
    kotlin 中的委托模式依靠by关键字,语法定义:
    val/var 属性名:属性的数据类型 by 代理类
    使用场景:
    (1) 延迟加载属性(lazy property):属性值只在初次访问时才会计算
    (2) 可观察属性(observable property):属性发生变化时,可以向监听器发生通知
    (3) 将多个属性保存在一个map内,而不是保存在多个独立的域内
  2. 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操作符是线程安全的。如果在不考虑多线程问题或者想提高更多的性能,也可以使

  1. 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)

运行结果

  1. apply
    调用某对象的apply函数,在函数块内可以通过 this 指代该对象。返回值为该对象自己
val a = "string".apply {
    println(this)
}
println(a)

运行结果:
string
string

  1. let
    调用某对象的let函数,则该对象为函数的参数。在函数块内可以通过 it 指代该对象。返回值为函数块的最后一行或指定return表达式
val a = "string".let {
    println(it)
    3
}
println(a)

运行结果:
string
3

  1. also
    调用某对象的also函数,则该对象为函数的参数。在函数块内可以通过 it 指代该对象。返回值为该对象自己
val a = "string".also {
    println(it)
}
println(a)

运行结果:
string
string

  1. 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

上一篇 下一篇

猜你喜欢

热点阅读