区分kotlin内置函数apply、also、run、let、with

一、区分内置函数apply、also、run、let、with

1、从返回值角度区分:

apply、also返回值是对象
run、let返回最后一行代码的结果值,指定的return 返回值

2、从内置函数内内使用的对象名称

apply、run、with使用this
also、let使用it

使用this可以在内置函数内省略不写直接调用对象的公有成员变量,it必须填上不可省略不写

3、测试kotlin内置函数代码

下面kotlin写了一个学生类,用于实验内置函数效果。

class Student(var name:String? = null, var age:Int = 12)
{
    override fun toString(): String {
        return "name: $name, age: $age"
    }
}

fun main(args: Array<String>) {

    //fun  T.let(f: (T) -> R): R = f(this)
    //let :返回最后一行代码的结果值/或者指定的return 返回值,对象操作名称it
    println("let内置函数:")
    var ret1 = Student().let {
        it.name = "你好"
        it.age = 22
        it
    }
    println(ret1)

    //run :返回最后一行代码的结果值/或者指定的return 返回值,对象操作名称this
    //fun  T.run(f: T.() -> R): R = f()
    println("run内置函数:")
    var ret3 = Student().run {
        name = "99"
        this
    }

    ret3.run {
        name = "100"
    }

    println(ret3)

    //apply :返回对象自身,对象操作名称this
    println("apply内置函数:")
    var ret2 = Student().apply {
        name = "小明"
        age = 22
    }
    println(ret2)

    //also :返回对象自身,对象操作名称it
    ret2 = ret2.also {
        it.name = "565"
        println(it)
    }.also {
        it.age = 33
        println(it)
    }

    //最后返回值
    println(ret2)

    //with的好处在于可以省略,this
    with(ret2){
        println("$name + $age")
    }
}

二、应用场合

1、with

为了省略不写this

//不省略前
with(ret2){
    println("${this.name} + ${this.age}")
}

//省略后
//with的好处在于可以省略,this省略后
with(ret2){
    println("$name + $age")
}

看!!我弄个println打印都要多加个字节!!!效果一样的。。。当然省略不写的好

2、apply、also、run、let

希望是对象自身是返回值,还是其他类型的返回值?
还是希望省略得不写内置对象名称是this,还是不省略的it呢?

你可能感兴趣的:(Kotlin,kotlin,android,java)