首页 > 其他分享 >Kotlin标准函数(语法糖)let with run also apply快速讲解

Kotlin标准函数(语法糖)let with run also apply快速讲解

时间:2024-07-14 20:01:21浏览次数:10  
标签:run 函数 val 对象 Kotlin 扩展 also append

目录

1、知识储备——扩展函数

原理

定义扩展函数

调用扩展函数

2、返回值为上下文对象的标准函数

apply

also

3、返回值为Lambda表达式结果

let

run

with

4、一表总结


1、知识储备——扩展函数

原理

Kotlin 在不继承父类或实现接口下,也能扩展一个类的新功能

定义扩展函数

fun 类A.扩展方法(参数):返回值类型 { }

调用扩展函数

val 新对象 =  类A()
val 获取返回值 = 新对象.扩展方法(传参数)

2、返回值为上下文对象的标准函数

apply

  • 对象引用为this(可省略)
  • 返回对象本身
  • 系统自带的扩展函数
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val result = StringBuilder().apply {
        append("Start eating fruits. \n")
        for (fruit in list) {
            append(fruit).append("\n")
        }
        append("Ate all fruits.")
    }

讲解:这里创建一个集合,StringBuilder对象创建后调用apply函数,StringBuilder相关方法直接调用即可,或this.方法名调用也可;最后这个对象整体返回给result变量

also

  • 对象引用为it(可自定义,但是不可省略)
  • 返回对象本身
  • 系统自带的扩展函数
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val result = StringBuilder().also {
        append("Start eating fruits. \n")
        for (fruit in list) {
            it.append(fruit).append("\n")
        }
        it.append("Ate all fruits.")
    }
//或者自定义引用
    val result = StringBuilder().also {temp->
        append("Start eating fruits. \n")
        for (fruit in list) {
            temp.append(fruit).append("\n")
        }
        temp.append("Ate all fruits.")
    }


讲解:与apply最大区别就是调用自身方法或属性,需要用it或自定义的名字来调用;最后也是将整体返回给result

3、返回值为Lambda表达式结果

let

  • 引用对象为it
  • 返回let函数最后一行非赋值语句值,否则返回Unit
  • 系统自带的扩展函数
//letResult接收Unit
val letResult:Int? = book.let { bookEntry: Book ->
    bookEntry.changePrice(100)
    bookEntry.name = "letResult"
}

//letResult接收100
val letResult:Int? = book.let { bookEntry: Book ->
    bookEntry.changePrice(100)
    bookEntry.name = "letResult"
    100
}

run

  • 引用对象为this(可省略)
  • 返回run函数最后一行非赋值语句值,否则返回Unit
  • 系统自带的扩展函数
//输出结果:  
    修改完成  
    阿文2

fun main() {
    val data = Data("阿文", 18)
    val reslut = data.run {
        name = "阿文2"
        "修改完成"
    }
    println(reslut)
    println(data.name)
}


with

  • 引用对象为this(可省略)
  • 返回run函数最后一行非赋值语句值,否则返回Unit
  • 非扩展函数
val withResult = with(book) {
    changePrice(300)
    name = "withResult"
    this //也可以把这个对象作为返回值
}
println("withResult $withResult")

讲解:和run用法不同,但是引用对象和返回方式是一模一样的

4、一表总结

标签:run,函数,val,对象,Kotlin,扩展,also,append
From: https://blog.csdn.net/m0_74837900/article/details/140421116

相关文章

  • C#面:Application builder的use和run方法有什么区别?
    这两个⽅法都在startupclass的configure⽅法⾥⾯调⽤。都是⽤来向应⽤请求管道⾥⾯添加中间件的。Use⽅法可以调⽤下⼀个中间件的添加,⽽run不会。在C#中,Applicationbuilder是用于构建和配置应用程序的类。它提供了一些方法来设置应用程序的各种属性和行为。其中,use和run方......
  • Windows11系统System.Runtime.Serialization.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个System.Runtime.Serialization.dll文件(挑选......
  • Crunchy Bridge 通过duckdb 对于pg 进行扩展
    Crunchy最近发布了一个CrunchyBridge的服务,通过duckdb扩展了pg对于数据分析的能力,官方发布的内容值得学习下参考玩法说明实际上目前社区也有一个pg的duckdb_fdw,也值得体验下,CrunchyBridge不是一个fdw扩展,反而是使用了类似citus的postgreshooks参考资料https://g......
  • 解决Microsoft Visual C++ runtime package找不到问题
    使用了Dism++进行电脑清理,不小心选择了下面两个内容:尤其是第二个packagecache绝对不能清空,否则不知道哪个软件就不能运行了,报MicrosoftvisualC++runtime问题.然后再安装各个版本MicrosoftvisualC++redis仍会报同样的问题,死循环了.网上有各种解决方案,有......
  • unity is running as administrator 管理员权限问题
    每次打开工程弹出unityisrunningasadministrator的窗口unity版本2022.3.34f1,电脑系统是win11系统解决方法一:解决方法二:unity版本2022.3.34f1,电脑系统是win11系统每次打开工程都会出现unityisrunningasadministrator的窗口,真的很烦人。本人使用第二种方法......
  • mormot.rest.core--TRestRunThreads
    mormot.rest.core--TRestRunThreads{************TRestRunThreads-REST实例的多线程处理}///访问TRest实例的多线程处理TRestRunThreads=class(TSynPersistentLock)protectedfOwner:TRest;//TRest实例的所有者fBackgroundTimer:TRest......
  • 2024-07-12 vue项目中 运行 npm run build 或 yarn build 打包 没有生成 xx.es.js 文
    我在写一个ui组件库,在打包时发现dist文件夹里没有生成我想要的xx.es.js文件,我查看了我的vue项目中的vue.config.js文件,发现build.lib没有指定输出的文件名解决方案:配置项目中的vue.config.js文件,参考我的......
  • “程序无法启动,因为您的计算机中丢失 VCRUNTIME140.dll。”怎么解决
    在计算机中经常会遇到各式各样的问题,其中遇到vcruntime140.dll丢失或许找不到vcruntime140.dll是经常常见的问题之一,那么当我们遇到vcruntime140.dll丢失问题时候要怎么办?下面我就给大家一一讲解vcruntime140.dll文件和vcruntime140.dll文件的多个解决方法!vcruntime140.dll......
  • Kubernetes高可用集群二进制离线部署(Runtime Docker)
    Kubernetes高可用集群二进制部署(RuntimeDocker)Kubernetes(简称为:k8s)是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了资源调度、部署管理、服务......
  • Kotlin小技巧之用Transformations.map方法转换LiveData
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点在Kotlin中,transformations.map是用于将一个LiveData的数据进行转换的拓展函数,它属于AndroidArchitectureComponents中的LiveData转换部分。这个函数允许你......