跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin apply函数
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Kotlin apply函数}} == 简介 == '''apply'''是Kotlin标准库中的一个[[作用域函数]](Scope Function),它允许在对象的上下文中执行代码块,并返回对象本身。该函数主要用于对象初始化或配置场景,其设计遵循[[函数式编程]]的"无副作用"原则,但实际使用时主要体现为简化对象构造过程的语法糖。 == 语法结构 == apply函数的声明如下: <syntaxhighlight lang="kotlin"> inline fun <T> T.apply(block: T.() -> Unit): T </syntaxhighlight> * '''T''':接收者对象类型 * '''block''':带有接收者的lambda表达式([[扩展函数]]形式) * 返回值:返回接收者对象本身(this) == 工作原理 == <mermaid> flowchart LR A[创建对象] --> B[调用apply函数] B --> C[在lambda内配置对象属性] C --> D[返回配置后的原对象] </mermaid> 数学表达: <math> apply(obj, f) = obj\text{,其中 }f(obj)\text{ 已被执行} </math> == 基础示例 == === 对象初始化 === 传统写法与apply对比: <syntaxhighlight lang="kotlin"> // 传统方式 val person = Person() person.name = "Alice" person.age = 30 // 使用apply val person = Person().apply { name = "Alice" // 等价于 this.name = "Alice" age = 30 // this可省略 } </syntaxhighlight> === 链式调用 === <syntaxhighlight lang="kotlin"> val file = File("data.txt").apply { setReadable(true) setWritable(true) createNewFile() }.also { println("文件创建于: ${it.absolutePath}") } </syntaxhighlight> == 核心特点 == {| class="wikitable" |- ! 特性 !! 说明 |- | '''返回对象本身''' || 总是返回接收者对象(this),允许链式调用 |- | '''隐式this''' || lambda内部自动包含接收者对象的上下文 |- | '''配置优于操作''' || 适合属性设置等初始化操作,不适合包含复杂逻辑 |- | '''空安全''' || 需配合安全调用运算符(?.)处理可空对象 |} == 实际应用场景 == === Android开发示例 === <syntaxhighlight lang="kotlin"> val textView = TextView(context).apply { text = "Hello World" textSize = 16f setTextColor(Color.BLACK) gravity = Gravity.CENTER } </syntaxhighlight> === 集合初始化 === <syntaxhighlight lang="kotlin"> val mutableList = mutableListOf<String>().apply { add("Kotlin") add("Java") addAll(listOf("Python", "C++")) sort() } </syntaxhighlight> == 与类似函数对比 == {| class="wikitable" |- ! 函数 !! 返回值 !! 上下文对象 !! 典型用途 |- | apply || this || this || 对象配置 |- | let || lambda结果 || it || 空检查/转换 |- | run || lambda结果 || this || 组合初始化+计算 |- | with || lambda结果 || this || 非扩展函数版本 |} == 高级用法 == === DSL构建 === <syntaxhighlight lang="kotlin"> class Dialog { var title: String = "" var message: String = "" fun show() { println("显示对话框: $title - $message") } } fun createDialog(init: Dialog.() -> Unit): Dialog { return Dialog().apply(init) } // 使用 createDialog { title = "警告" message = "确认删除吗?" }.show() </syntaxhighlight> === 配合扩展函数 === <syntaxhighlight lang="kotlin"> fun String.toSpanned(): Spanned { return SpannableString(this).apply { setSpan(StyleSpan(Typeface.BOLD), 0, length, 0) setSpan(ForegroundColorSpan(Color.RED), 0, 5, 0) } } </syntaxhighlight> == 注意事项 == * 避免在apply块中包含可能抛出异常的代码 * 不应滥用apply导致"横向代码"(难以跟踪的嵌套) * 与also的区别:also使用it引用对象,apply使用this * 性能影响:inline函数无运行时开销 == 常见问题 == === 什么时候不该用apply? === 当需要: * 返回非接收者对象时 * 处理可能为null的对象(应使用?.let) * 需要明确区分作用域时 === 为什么返回this而不是Unit? === 为了实现[[流畅接口]](Fluent Interface)模式,允许方法链式调用。 == 总结 == apply函数通过提供简洁的对象配置语法,显著提高了Kotlin代码的可读性和编写效率。作为作用域函数家族的重要成员,它特别适合以下场景: * 对象初始化过程中的多属性设置 * 构建器模式的简化实现 * DSL构造 * 链式操作中的中间步骤 掌握apply函数是理解Kotlin[[函数式编程]]风格的关键一步,建议通过实际项目练习来体会其设计哲学。 [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin函数式编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)