• Kotlin 中let 、run 、with、apply、also的用法与区别


    实例代码

    1. User(val userName:String,val age:Int){
    2. fun printName(){
    3. println(userName)
    4. }
    5. fun getUserName():String{
    6. return userName
    7. }
    8. }

    let 函数

    let 函数常用来与对象的空判断一起用,起到作用于的限定效果。let 函数最后一行返回值。(比如实例需要let函数返回一个处理后的字符串值,则最后一行直接返回一个字符串)

    1. val param:User? = null
    2. //let 的用法,判空
    3. val uName = param?.let{//it
    4. //在这个闭包内部 it 指代非空的param 参数
    5. it.printName()
    6. //闭包内最后一个代码执行的结果即为返回值
    7. it.getUserName() //返回一个字符串对象
    8. }

    run 函数

    run 函数和let 函数非常相似,但是有一点不同:闭包内部不再像let函数中指定it代表对象,run 函数的闭包直接是this,可以简单理解为 run 方法扩展函数内部代用该对象的任何函数和属性就是在该对象内部调用一样,不再需要通过实例对象。看代码:

    1. val param:User? = null
    2. val uName= param?.run{ //this
    3. //在这个闭包内部 this 指代非空的User 对象
    4. printName() //因为run 内部所有调用都相当于在User对象内部,所以可以不用this
    5. this.printName()
    6. //闭包内最后一个代码执行的结果即为返回值
    7. this.getUserName() //返回一个字符串对象.
    8. }

    with 函数

    适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,有点和run方法相似,但是with函数不是一个扩展函数,是一个一般函数,直接调用。返回值仍然是最后一行代码执行的结果。

    1. val param:User? = null
    2. val uName= with(param){ //this
    3. //在这个闭包内部 this 指代非空的User 对象
    4. printName() //因为with 内部所有调用都相当于在User对象内部,所以可以不用this
    5. this.printName()
    6. //闭包内最后一个代码执行的结果即为返回值
    7. this.getUserName() //返回一个字符串对象.
    8. }

    apply 函数

    apply 有点类似于 with 与run 的结合,但是不同的是返回值不再是代码的最后一行的结果,而是返回对象本身。

    1. val param:User? = null
    2. val newUser:User? = null
    3. val newUser = param?.apply{ //this
    4. //在这个闭包内部 this 指代非空的User 对象
    5. printName() //因为apply 内部所有调用都相当于在User对象内部,所以可以不用this
    6. this.printName()
    7. this.getUserName() //这里不再返内容,而是直接返回param对象
    8. }

    also 函数

    also 有点类似于let 与run 的结合,但是不同的是返回值不再是代码的最后一行的结果,而是返回对象本身,闭包内部不再是this对象而是it 

    1. val param:User? = null
    2. val newUser:User? = null
    3. val newUser = param?.apply{ //it
    4. //在这个闭包内部 it指代非空的param 对象
    5. it.printName()
    6. it.getUserName() //这里不再返内容,而是直接返回param对象
    7. }

    这个方法非常类似,灵活应用即可。主要却别返回值和闭包内的作用域

  • 相关阅读:
    圣杯布局和双飞翼布局
    用OneFlow实现数据类型自动提升
    OPC C#连接OPC C#上位机链接PLC程序源码
    python web框架 flask基础入门教程
    Unity 在子线程中调用主线程的方法
    pytorch 标签平滑代码
    九州云与英特尔联合发布智慧校园私有云框架,赋能教育新基建
    好用到爆!GitHub 星标 32.5k+的命令行软件管理神器,功能真心强大!
    AnythingLLM 的 Docker 使用
    CVE-2023-36845:Juniper Networks Junos OS EX远程命令执行漏洞
  • 原文地址:https://blog.csdn.net/ggdffftghjndjnd/article/details/134055599