前言 和Java相比,在Kotlin中提供了不少新的特性。这次我们就来聊一聊Kotlin的一些通用的扩展标准函数run,with,let,also和apply。对于这五个标准函数它们都存在于Kotlin的源码标准库当中,也就是在Standard.kt文件当中。它们都是适用于任何对象的通用扩展函数。但是对于run,with,let,also和apply这五个函数他们的用法及其相似,以至于我们无法确定去选择使用哪一个。那么现在我们就来聊一下这五个函数它们的使用方法,它们的不同之处以及在什么场景下去使用。 作用域函数 在这里我们重点是看一下run,with,T.run,T.let,T.also,和 在Kotlin编程语言中,有一些非常实用的扩展标准函数,如`run`, `with`, `let`, `also`, 和 `apply`。这些函数都存在于Kotlin标准库的`kotlinstdlib`包中,它们提供了方便的上下文操作,使得代码更简洁、可读性更强。虽然它们在语法上有些相似,但每种函数都有其特定的用途和微妙的差异。 `run`函数创建了一个新的作用域,在这个作用域内,你可以定义局部变量并执行一些操作。`run`的返回值是该作用域中最后执行表达式的值。例如,如果你有一个需要在多个条件分支下执行相同操作的场景,`run`可以帮助你避免重复的代码。 ```kotlin val result = if (condition) run { // 执行一系列操作 val temp = doSomething() temp * 2 } else { // 其他操作 0 } ``` `with`函数接收一个对象作为参数,并在该对象的作用域内执行一些操作。与`run`不同,`with`的接收者是传入的对象,这意味着你可以直接调用对象的方法而无需显式引用。如果传入的对象可能是`null`,使用`with`时需要确保进行非空检查,否则可能导致`NullPointerException`。 ```kotlin with(someObject) { method() anotherMethod() } ``` `let`函数与`run`类似,但它使用`it`关键字来引用传入的对象,而不是`this`。`let`通常用于在条件语句中简化操作,尤其是当需要将结果赋值给新变量时。如果需要避免覆盖外部作用域的`this`,`let`是一个好选择。 ```kotlin val maybeNull: String? = nullableString val nonNullString = maybeNull?.let { it.toUpperCase() } ``` `also`函数用于在执行一系列操作后返回原始对象。这在需要链式调用并且在每个步骤后仍然需要原始对象的情况下很有用。 ```kotlin val list = mutableListOf<Int>().also { it.add(1) }.also { it.add(2) } ``` `apply`与`also`类似,但在`apply`中,返回的是修改后的对象,而不是`this`。这使得`apply`适合在初始化对象时设置属性,因为返回的对象可以直接用于后续的初始化步骤。 ```kotlin val view = View(context).apply { layoutParams = ViewGroup.LayoutParams.WRAP_CONTENT backgroundColor = Color.BLUE } ``` 总结一下,这些函数的主要区别在于: 1. **`run`**:创建新的作用域,返回作用域内最后的表达式。 2. **`with`**:在对象的作用域内执行操作,返回对象本身。 3. **`let`**:使用`it`引用对象,返回`let`块内的表达式结果。 4. **`also`**:执行一系列操作后返回原始对象,方便链式调用。 5. **`apply`**:与`also`相似,但返回修改后的对象,常用于初始化。 在选择使用哪个函数时,要考虑你的具体需求,如是否需要返回值、是否需要改变原始对象、是否需要避免覆盖`this`等。通过理解这些函数的细微差别,你可以更好地优化你的Kotlin代码。




























- 粉丝: 2
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 吉林大学网络机电一体化技术答案.doc
- 学生成绩自动统计分析软件.pdf
- 机械及电气自动化基础.pptx
- 人工智能简介PPT.ppt
- 计算机网络体系结构与协议.ppt
- 专升本《计算机组成原理》模拟题试卷.doc
- 网络营销经济阿里金融业务版图加速扩容跨境支付等或年.pptx
- 遗传算法的C++代码实现教程.doc
- 用友致远协同管理软件操作手册.doc
- 通信交流引入规范.doc
- 最新的软件工程试题及参考答案.doc
- 云计算导论:概念-架构与应用PPT第4章.pptx
- 基于目标与项目管理相结合绩效考评体系构建的研究样本.doc
- 某医院网络与信息安全自查工作总结报.doc
- 网络改造实施方案.doc
- 2023年CAD机械制图常用图纸技术要求.doc


