跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin with函数
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:Kotlin with函数}} '''Kotlin with函数'''是标准库中的一种[[作用域函数]](Scope Function),允许在对象的上下文中执行代码块,无需重复引用对象名称。它特别适用于对同一对象进行多步操作的场景,能显著提升代码可读性。 == 基本语法与原理 == <code>with</code>函数的签名为: <syntaxhighlight lang="kotlin"> inline fun <T, R> with(receiver: T, block: T.() -> R): R </syntaxhighlight> * '''receiver''':要操作的目标对象 * '''block''':在接收者上下文中执行的lambda表达式 * 返回值为lambda的最后一行结果(或显式<code>return</code>) === 工作流程 === <mermaid> graph LR A[传入对象] --> B[在lambda内作为this访问] B --> C[执行操作] C --> D[返回结果] </mermaid> == 基础示例 == 对比传统写法与<code>with</code>的差异: <syntaxhighlight lang="kotlin"> // 传统方式 val list = mutableListOf<String>() list.add("Apple") list.add("Banana") list.joinToString() // 使用with val result = with(mutableListOf<String>()) { add("Apple") // 隐含this.add() add("Banana") joinToString() // 返回值 } println(result) // 输出: Apple, Banana </syntaxhighlight> == 关键特性 == === 上下文对象访问 === 在<code>with</code>块内,接收者对象作为'''this'''(可省略): <syntaxhighlight lang="kotlin"> with(StringBuilder()) { append("Hello") // 相当于this.append() append(" Kotlin") toString() // 返回构建的字符串 } </syntaxhighlight> === 返回值处理 === 返回类型由lambda的最后一行决定: <syntaxhighlight lang="kotlin"> val length = with("Kotlin") { println("Processing string: $this") length // 返回Int类型 } </syntaxhighlight> == 实际应用场景 == === 对象初始化 === 简化多属性配置: <syntaxhighlight lang="kotlin"> class Config { var host: String = "" var port: Int = 0 var timeout: Long = 0 } val config = with(Config()) { host = "api.example.com" port = 443 timeout = 30_000 this // 显式返回配置对象 } </syntaxhighlight> === 数据转换 === 链式处理集合: <syntaxhighlight lang="kotlin"> val formattedData = with(listOf(1, 2, 3)) { filter { it > 1 } map { it * 10 } joinToString("|") } // 结果: "20|30" </syntaxhighlight> == 与其它作用域函数对比 == {| class="wikitable" |- ! 函数 !! 接收者访问 !! 返回值 !! 是否扩展函数 |- | <code>with</code> || this || lambda结果 || 否 |- | <code>apply</code> || this || 接收者 || 是 |- | <code>run</code> || this || lambda结果 || 是 |- | <code>let</code> || it || lambda结果 || 是 |- | <code>also</code> || it || 接收者 || 是 |} == 性能考量 == 由于<code>with</code>是内联函数(inline),不会产生额外的运行时开销。编译后的代码相当于直接在接收者对象上执行操作。 == 数学表达 == 对于操作序列<math>f_1, f_2, ..., f_n</math>应用于对象<math>x</math>: <math> \text{with}(x) \{ f_1; f_2; ...; f_n \} \equiv f_n(...f_2(f_1(x))) </math> == 最佳实践 == 1. '''适用场景''': * 需要对同一对象执行多个操作 * 需要将对象转换为其他形式 2. '''避免场景''': * 需要处理可空对象时(应使用<code>?.let</code>) * 需要返回接收者对象本身时(应使用<code>apply</code>) == 进阶示例 == === DSL构建 === <syntaxhighlight lang="kotlin"> with(HTML()) { head { title { +"Kotlin with() Demo" } } body { h1 { +"Function Scope" } p { +"Clean code generator" } } } </syntaxhighlight> === 复杂计算 === <syntaxhighlight lang="kotlin"> val triangleArea = with(Triangle(3.0, 4.0, 5.0)) { val s = (a + b + c) / 2.0 sqrt(s * (s - a) * (s - b) * (s - c)) // 海伦公式 } </syntaxhighlight> == 常见问题 == === 与Java互操作 === 当在<code>with</code>块内调用Java方法时,需注意<code>this</code>可能被误认为指向外部类。解决方法: <syntaxhighlight lang="kotlin"> with(javaObj) { this@OuterClass.someMethod() this@with.javaMethod() // 显式指定 } </syntaxhighlight> === 变量遮蔽 === 避免在<code>with</code>块内声明与外部同名的变量: <syntaxhighlight lang="kotlin"> val name = "Global" with(Person("Local")) { println(name) // 输出Person的name属性 println(this@with.name) // 显式访问 } </syntaxhighlight> {{Kotlin编程概念}} [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin函数式编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Kotlin编程概念
(
编辑
)