kotlin 作用域函数let、run、 with、apply、also

kotlin 作用域函数let、run、 with、apply、also

文章思路

  1. let \ run \ with \ apply \ also 详解
 //[1] 返回值,apply \ also 返回上下文,可以组成链式调度
    per.let {
        it.move()
    }
    per.also {
        it.move()
    }
    //链式调度
    per.also {  }.let {  }.also {  }


    //[2] let、run\with,最后个语句返回 返回
    per.run {
        this.move()
    }
    per.apply {
        move()
    }
    with(per){
        move()
    }

    //[3] let, 使用 it 标识 上下文对象,返回值是 lambda 结果
    // 1. 用作多个方法结果的回调链,
    //2. 用作执行一段代码块,获得返回值
    val str: String? = "Hello"
    val length = str?.let {
        it.length
    }

    //[4] with ,非扩展方法,上下文作为参数,this 标识上下文,返回值是 lambda 结果
    //建议,with 方法块里调用上下文对象的多个方法,不使用返回值
    val numbers = mutableListOf("one", "two", "three")
    val firstAndLast = with(numbers) {
        var first = first()
        var last = last()
    }

    //[5] run, this 标识上下文,返回值是 lambda
    // run 与 with 类似,但是和 let 调用方式相同
    // run 在你对象初始化后,立即执行操作并得到返回值
    val length2 = str?.run {
        length
    }

    //[6] apply, this 标识上下文对象,返回值是对象本身
    // 用于给对象设置属性值
    val adam = Person("Adam").apply {
        name = "32"
    }

    //[7] also,it 指代 上下文,返回值是对象本身
    //用于执行一些不改变对象属性的动作,如打印日志,debug 信息等,即使你删除 alse 代码可不会对逻辑有改变
    per.also { println() }
  1. 函数比较
方法 自身引用 返回值 是否扩展方法
let it lambda 结果 yes
run this lambda 结果 yes
with this lambda 结果 no, 上下文作为参数
apply this 上下文对象 yes
also this 上下文对象 yes
  1. 简短建议
- 非空对象执行 lambda 表达式 ——》 let
- 引入表达式作为值返回 ——》let
- 对象配置 ——》 apply
- 对象配置并且计算结果 ——>run
- 额外效果——》also
- 对象上执行的组方法 ——》with

你可能感兴趣的:(Kotlin,学习笔记系列)