跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin作用域函数
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本文适用于Kotlin初学者及需要系统理解作用域函数的开发者。所有示例基于Kotlin 1.7+版本。}} = Kotlin作用域函数 = '''作用域函数'''(Scope Functions)是Kotlin标准库中的一组扩展函数,允许在对象的上下文中执行代码块,从而形成临时作用域。这些函数通过简洁的语法显著提升代码的可读性和表达力,是函数式编程风格的核心工具之一。 == 核心概念 == Kotlin提供以下五种作用域函数: * <code>let</code> * <code>run</code> * <code>with</code> * <code>apply</code> * <code>also</code> 它们的共性是接收一个对象(接收者)和一个lambda表达式,区别在于: # 上下文对象的引用方式(<code>this</code>或<code>it</code>) # 返回值类型(接收者对象或lambda结果) <mermaid> flowchart TD A[选择作用域函数] --> B{需要返回接收者对象?} B -->|Yes| C[apply/also] B -->|No| D{需要扩展函数形式?} D -->|Yes| E[let/run] D -->|No| F[with] </mermaid> == 函数对比表 == {| class="wikitable" |+ 作用域函数特性对比 ! 函数 !! 对象引用 !! 返回值 !! 是否扩展函数 |- | <code>let</code> || <code>it</code> || lambda结果 || 是 |- | <code>run</code> || <code>this</code> || lambda结果 || 是/否 |- | <code>with</code> || <code>this</code> || lambda结果 || 否 |- | <code>apply</code> || <code>this</code> || 接收者对象 || 是 |- | <code>also</code> || <code>it</code> || 接收者对象 || 是 |} == 详细解析 == === let === '''典型用例''':空安全检查、链式调用转换 <syntaxhighlight lang="kotlin"> val numbers = listOf("one", "two", "three") val modifiedFirstItem = numbers.first().let { firstItem -> println("First item: $firstItem") firstItem.replaceFirstChar { it.uppercase() } } println(modifiedFirstItem) // 输出: One </syntaxhighlight> 数学表达:<math>let(f) = f(x)</math>,其中x是接收者对象 === run === '''典型用例''':对象初始化+计算结果 <syntaxhighlight lang="kotlin"> val hexNumber = run { val digits = "0-9A-F" val hexRegex = Regex("[$digits]+") val input = readLine() ?: "" if (input.matches(hexRegex)) input.toInt(16) else null } </syntaxhighlight> === with === '''典型用例''':对非空对象执行多个操作 <syntaxhighlight lang="kotlin"> val builder = StringBuilder() with(builder) { append("Hello") append(" ") append("Kotlin") toString() } </syntaxhighlight> === apply === '''典型用例''':对象配置 <syntaxhighlight lang="kotlin"> val adam = Person("Adam").apply { age = 32 city = "London" } </syntaxhighlight> === also === '''典型用例''':附加效果 <syntaxhighlight lang="kotlin"> val numbers = mutableListOf(1, 2, 3) numbers.also { println("Before adding: $it") }.add(4) </syntaxhighlight> == 性能考量 == 作用域函数会创建临时lambda对象,在性能关键代码中应考虑内联函数: {| class="wikitable" |+ 内联特性 ! 函数 !! 是否内联 |- | <code>let</code> || 是 |- | <code>run</code> || 是(扩展版本) |- | <code>with</code> || 否 |- | <code>apply</code> || 是 |- | <code>also</code> || 是 |} == 实际案例 == === 案例1:Android视图初始化 === <syntaxhighlight lang="kotlin"> val textView = TextView(context).apply { text = "Hello" textSize = 16f setPadding(10, 0, 10, 0) } </syntaxhighlight> === 案例2:数据处理管道 === <syntaxhighlight lang="kotlin"> fun processInput(input: String?) = input ?.takeIf { it.isNotBlank() } ?.let { it.trim() } ?.run { if (length > MAX_LENGTH) substring(0, MAX_LENGTH) else this } ?.also { log("Processed: $it") } </syntaxhighlight> == 常见误区 == 1. '''过度嵌套''':避免深度嵌套作用域函数 <syntaxhighlight lang="kotlin"> // 反模式 obj?.let { it.a?.let { it.b?.let { ... } } } </syntaxhighlight> 2. '''错误选择''':根据需求选择正确函数 * 需要返回对象本身 → <code>apply</code>/<code>also</code> * 需要返回计算结果 → <code>let</code>/<code>run</code>/<code>with</code> 3. '''空安全混淆''':注意可空性传播 <syntaxhighlight lang="kotlin"> val length = nullableString?.let { it.length } // 类型为Int? </syntaxhighlight> == 最佳实践 == * 优先使用<code>this</code>引用的函数(<code>run</code>/<code>apply</code>)处理对象成员 * 使用<code>it</code>引用的函数(<code>let</code>/<code>also</code>)处理需要重命名或链式调用的情况 * 对非扩展形式,<code>with</code>比<code>run</code>更语义化 * 日志/调试操作使用<code>also</code>保持代码纯净 {{Tip|在IntelliJ IDEA中可以通过''Show Context Actions''(Alt+Enter)快速转换作用域函数}} [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin函数式编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Note
(
编辑
)
模板:Tip
(
编辑
)