Android经典面试题之Kotlin中常见作用域函数

简介: **Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Kotlin 中提供了一些内置的作用域函数(Scope Functions),它们通过改变代码块的上下文对象,使代码更加简洁和易读。主要的作用域函数有以下五个:letrunwithapplyalso。这些函数主要区别在于:传递给代码块的对象是作为参数还是接收者,以及它们的返回值是什么。以下是对每个作用域函数的详细说明:

1. let

  • 用法let 函数常用于可以避免空指针异常(NullPointerException),即在对象为非空时执行特定代码块。
  • 上下文对象:通过参数 it 传递。
  • 返回值:返回代码块的执行结果。
val name: String? = "Kotlin"
val result = name?.let {
    println("Name length: ${it.length}")
    it.length
}
println(result)  // 输出: Name length: 6
                 // 输出: 6
AI 代码解读

2. run

  • 用法run 函数通常用于在对象的上下文中执行一段代码,并返回代码块的结果。
  • 上下文对象:通过接收者 this 传递。
  • 返回值:返回代码块的执行结果。
val name = "Kotlin"
val result = name.run {
    println("Name length: $length")  // this指向name,所以可以直接访问length
    length
}
println(result)  // 输出: Name length: 6
                 // 输出: 6
AI 代码解读

3. with

  • 用法with 函数不是一个扩展函数,而是一个普通的高阶函数。它在提供的一种对象上执行代码块,经常用于对同一个对象的多个属性进行操作。
  • 上下文对象:通过接收者 this 传递。
  • 返回值:返回代码块的执行结果。
val name = "Kotlin"
val result = with(name) {
    println("Name length: $length")  // this指向name,所以可以直接访问length
    length
}
println(result)  // 输出: Name length: 6
                 // 输出: 6
AI 代码解读

4. apply

  • 用法apply 函数通常用于配置对象。它在代码块内可以引用对象的所有公有成员,可以对对象进行初始化、属性设置等操作。
  • 上下文对象:通过接收者 this 传递。
  • 返回值:返回对象本身。
val person = Person().apply {
    name = "Kotlin"
    age = 5
}
println(person)  // 输出: Person(name=Kotlin, age=5)
AI 代码解读

5. also

  • 用法also 函数通常用于在链式调用中进行一些额外的操作,比如打印日志或者进行某些检查。
  • 上下文对象:通过参数 it 传递。
  • 返回值:返回对象本身。
val name = "Kotlin"
val result = name.also {
    println("Name is $it")
}
println(result)  // 输出: Name is Kotlin
                 // 输出: Kotlin
AI 代码解读

总结

  • letalso:通过 it 作为参数传递上下文对象。
  • runwithapply:通过 this 作为接收者传递上下文对象。
  • letrunwith:返回代码块的结果。
  • applyalso:返回上下文对象自身。

根据需求选择合适的作用域函数,可以让你的代码更简洁和直观。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
打赏
0
8
8
0
149
分享
相关文章
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
107 9
|
7月前
|
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数
194 6
|
7月前
|
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
82 6
Kotlin教程笔记(6) - 函数与Lambda表达式
Kotlin教程笔记(6) - 函数与Lambda表达式
93 1
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
87 13
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
64 1
|
8月前
|
Kotlin - 作用域函数
Kotlin - 作用域函数
66 0
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数

热门文章

最新文章

  • 1
    云计算运维工程师面试技巧
    924
  • 2
    【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
    331
  • 3
    【机器学习】面试问答:决策树如何进行剪枝?剪枝的方法有哪些?
    243
  • 4
    【机器学习】SVM面试题:简单介绍一下SVM?支持向量机SVM、逻辑回归LR、决策树DT的直观对比和理论对比,该如何选择?SVM为什么采用间隔最大化?为什么要将求解SVM的原始问题转换为其对偶问题?
    220
  • 5
    【深度学习】Pytorch面试题:什么是 PyTorch?PyTorch 的基本要素是什么?Conv1d、Conv2d 和 Conv3d 有什么区别?
    742
  • 6
    【深度学习】TensorFlow面试题:什么是TensorFlow?你对张量了解多少?TensorFlow有什么优势?TensorFlow比PyTorch有什么不同?该如何选择?
    584
  • 7
    【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
    513
  • 8
    【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?
    574
  • 9
    【数据挖掘】 GBDT面试题:其中基分类器CART回归树,节点的分裂标准是什么?与RF的区别?与XGB的区别?
    195
  • 10
    【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
    1033
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问