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

实例代码

Kotlin 复制代码
User(val userName:String,val age:Int){

    fun printName(){
        println(userName)
    }


    fun getUserName():String{
        return userName
    }

}

let 函数

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

Kotlin 复制代码
val param:User? = null

//let 的用法,判空
val uName = param?.let{//it
    //在这个闭包内部 it 指代非空的param 参数
    it.printName()

    //闭包内最后一个代码执行的结果即为返回值
    it.getUserName()   //返回一个字符串对象
}

run 函数

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

Kotlin 复制代码
val param:User? = null


val uName= param?.run{ //this
    //在这个闭包内部 this 指代非空的User 对象
    printName()  //因为run 内部所有调用都相当于在User对象内部,所以可以不用this
    this.printName()    

    //闭包内最后一个代码执行的结果即为返回值
    this.getUserName()   //返回一个字符串对象.
}

with 函数

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

Kotlin 复制代码
val param:User? = null


val uName= with(param){ //this
    //在这个闭包内部 this 指代非空的User 对象
    printName()  //因为with 内部所有调用都相当于在User对象内部,所以可以不用this
    this.printName()    

    //闭包内最后一个代码执行的结果即为返回值
    this.getUserName()   //返回一个字符串对象.
}

apply 函数

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

Kotlin 复制代码
val param:User? = null

val newUser:User? = null 

val newUser = param?.apply{ //this
    //在这个闭包内部 this 指代非空的User 对象
    printName()  //因为apply 内部所有调用都相当于在User对象内部,所以可以不用this
    this.printName()    

    this.getUserName()   //这里不再返内容,而是直接返回param对象
}

also 函数

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

Kotlin 复制代码
val param:User? = null

val newUser:User? = null 

val newUser = param?.apply{ //it
    //在这个闭包内部 it指代非空的param 对象
    it.printName()

    it.getUserName()   //这里不再返内容,而是直接返回param对象
}

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

相关推荐
云水一下6 小时前
从零开始!VMware安装Fedora Workstation 44桌面系统完整教程
前端
小码哥_常7 小时前
安卓黑科技:实现多平台商品详情页一键跳转APP
前端
killerbasd7 小时前
还是迷茫 5.3
前端·react.js·前端框架
不会敲代码18 小时前
TCP/IP 与前端性能:从数据包到首次渲染的底层逻辑
前端·tcp/ip
kyriewen8 小时前
奥特曼借GPT-5.5干杯,而你的Copilot正按Token收钱
前端·github·openai
AC赳赳老秦8 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
kyriewen8 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
不会敲代码18 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库实现语义搜索
javascript·openai
千寻girling9 小时前
《 Git 详细教程 》
前端·后端·面试
threelab9 小时前
Three.js UV 图像变换效果 | 三维可视化 / AI 提示词
javascript·人工智能·uv