ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 几个函数 为了帮助你为你的场景选择合适的作用域函数,我们会详细地描述它们并且提供一些使用建议。从技术角度来说,作用域函数在很多场景里是可以互换的,所以这些示例展示了定义通用使用风格的约定用法。 ### `let` **上下文对象**作为 lambda 表达式的参数(`it`)来访问。**返回值**是 lambda 表达式的结果。 `let` 可用于在调用链的结果上调用一个或多个函数。例如,以下代码打印对集合的两个操作的结果: ```kotlin fun main() { //sampleStart val numbers = mutableListOf("one", "two", "three", "four", "five") val resultList = numbers.map { it.length }.filter { it > 3 } println(resultList) //sampleEnd } ``` 使用 `let`,可以写成这样: ```kotlin fun main() { //sampleStart val numbers = mutableListOf("one", "two", "three", "four", "five") numbers.map { it.length }.filter { it > 3 }.let { println(it) // 如果需要可以调用更多函数 } //sampleEnd } ``` 若代码块仅包含以 `it` 作为参数的单个函数,则可以使用方法引用(`::`)代替 lambda 表达式: ```kotlin fun main() { //sampleStart val numbers = mutableListOf("one", "two", "three", "four", "five") numbers.map { it.length }.filter { it > 3 }.let(::println) //sampleEnd } ``` `let` 经常用于仅使用非空值执行代码块。如需对非空对象执行操作,可对其使用安全调用操作符 `?.` 并调用 `let` 在 lambda 表达式中执行操作。 ```kotlin fun processNonNullString(str: String) {} fun main() { //sampleStart val str: String? = "Hello" //processNonNullString(str) // 编译错误:str 可能为空 val length = str?.let { println("let() called on $it") processNonNullString(it) // 编译通过:'it' 在 '?.let { }' 中必不为空 it.length } //sampleEnd } ``` 使用 `let` 的另一种情况是引入作用域受限的局部变量以提高代码的可读性。如需为上下文对象定义一个新变量,可提供其名称作为 lambda 表达式参数来替默认的 `it`。 ```kotlin fun main() { //sampleStart val numbers = listOf("one", "two", "three", "four") val modifiedFirstItem = numbers.first().let { firstItem -> println("The first item of the list is '$firstItem'") if (firstItem.length >= 5) firstItem else "!" + firstItem + "!" }.toUpperCase() println("First item after modifications: '$modifiedFirstItem'") //sampleEnd } ```