跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kotlin高阶函数
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本内容适用于具备Kotlin基础语法知识的读者。如需复习函数基础,请参考相关章节。}} = Kotlin高阶函数 = '''高阶函数'''(Higher-Order Functions)是指能够接收函数作为参数或返回函数作为结果的函数。这是函数式编程的核心特性之一,Kotlin通过此特性实现了更灵活的代码抽象和组合能力。 == 核心概念 == === 数学基础 === 在数学中,高阶函数的定义可表示为: <math>H(f) = \int_{a}^{b} f(x) \,dx</math> 其中<math>H</math>是以函数<math>f</math>为参数的函数。 === Kotlin实现特性 === Kotlin中所有函数都是'''一等公民'''(First-class citizens),即: * 可赋值给变量 * 可作为参数传递 * 可作为其他函数的返回值 == 基础语法 == === 函数作为参数 === <syntaxhighlight lang="kotlin"> fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } fun add(x: Int, y: Int) = x + y fun main() { val result = calculate(10, 5, ::add) println("计算结果: $result") // 输出: 计算结果: 15 } </syntaxhighlight> === 函数作为返回值 === <syntaxhighlight lang="kotlin"> fun getOperation(type: String): (Int, Int) -> Int { return when (type) { "add" -> { a, b -> a + b } "multiply" -> { a, b -> a * b } else -> throw IllegalArgumentException("未知操作类型") } } fun main() { val operation = getOperation("multiply") println("运算结果: ${operation(3, 4)}") // 输出: 运算结果: 12 } </syntaxhighlight> == Lambda表达式 == Kotlin中常用lambda简化高阶函数调用: <syntaxhighlight lang="kotlin"> fun main() { val numbers = listOf(1, 2, 3, 4) // 使用lambda过滤偶数 val evens = numbers.filter { it % 2 == 0 } println(evens) // 输出: [2, 4] // 使用lambda进行映射 val squares = numbers.map { it * it } println(squares) // 输出: [1, 4, 9, 16] } </syntaxhighlight> == 实际应用案例 == === 回调机制 === Android开发中的典型应用: <syntaxhighlight lang="kotlin"> class Downloader { fun downloadFile(url: String, onComplete: (File) -> Unit) { // 模拟下载过程 Thread.sleep(2000) val file = File("downloaded_${System.currentTimeMillis()}") onComplete(file) } } fun main() { val downloader = Downloader() downloader.downloadFile("http://example.com/file") { file -> println("文件下载完成: ${file.name}") } } </syntaxhighlight> === 领域特定语言(DSL) === 构建HTML DSL示例: <syntaxhighlight lang="kotlin"> fun html(init: HTML.() -> Unit): HTML { val html = HTML() html.init() return html } class HTML { fun body(init: Body.() -> Unit) { ... } } // 使用示例 val page = html { head { title { +"Kotlin DSL" } } body { h1 { +"高阶函数应用" } } } </syntaxhighlight> == 性能考量 == 高阶函数会生成额外的对象,可能影响性能。Kotlin通过'''内联函数'''优化: <syntaxhighlight lang="kotlin"> inline fun <T> lock(lock: Lock, body: () -> T): T { lock.lock() try { return body() } finally { lock.unlock() } } </syntaxhighlight> <mermaid> graph TD A[调用高阶函数] --> B[创建函数对象] B --> C[调用函数对象] C --> D[返回结果] style A fill:#f9f,stroke:#333 style B fill:#bbf,stroke:#333 </mermaid> == 高级技巧 == === 函数组合 === 将多个函数组合成新函数: <syntaxhighlight lang="kotlin"> infix fun <P1, P2, R> ((P1) -> P2).andThen(f: (P2) -> R): (P1) -> R { return { p1 -> f(this(p1)) } } fun main() { val double = { i: Int -> i * 2 } val square = { i: Int -> i * i } val doubleThenSquare = double andThen square println(doubleThenSquare(3)) // 输出: 36 } </syntaxhighlight> === 柯里化(Currying) === 将多参数函数转换为单参数函数链: <syntaxhighlight lang="kotlin"> fun <A, B, C> curry(f: (A, B) -> C): (A) -> (B) -> C { return { a -> { b -> f(a, b) } } } fun main() { val sum = { a: Int, b: Int -> a + b } val curriedSum = curry(sum) println(curriedSum(2)(3)) // 输出: 5 } </syntaxhighlight> == 常见问题 == {{Warning|1=避免在循环中创建大量lambda对象}} {| class="wikitable" |- ! 问题 !! 解决方案 |- | 性能开销 | 使用inline修饰符 |- | 可读性降低 | 合理命名lambda参数 |- | 调试困难 | 使用命名函数替代复杂lambda |} == 最佳实践 == * 对性能关键代码使用inline * 保持lambda简短(建议不超过5行) * 为复杂操作使用命名函数参数 * 优先使用标准库高阶函数(如let、apply等) {{Tip|Android开发者应特别注意:ProGuard可能优化掉未使用的lambda,需添加相应规则}} == 延伸阅读 == * 函数式编程范式 * Kotlin作用域函数 * 接收者函数字面值 [[Category:编程语言]] [[Category:Kotlin]] [[Category:Kotlin函数]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Tip
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)