高阶函数(以函数作为参数或返回值的函数)
1. 高阶函数的概念
高阶函数(Higher-Order Function)是指可以接受函数作为参数或返回函数的函数。Kotlin 作为一门支持函数式编程的语言,高阶函数是其核心特性之一。
特点:
- 函数是一等公民:函数可以像普通变量一样传递和返回
- 提升代码复用性:通过将行为参数化,减少重复代码
- 更简洁的表达:配合Lambda表达式,使代码更简洁
2. 函数作为参数
基本语法
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
示例
fun main() {
val sum = { x: Int, y: Int -> x + y }
val result = calculate(5, 3, sum) // 输出8
// 直接传递Lambda表达式
calculate(5, 3, { a, b -> a * b }) // 输出15
}
3. 函数作为返回值
基本语法
fun getOperation(type: String): (Int, Int) -> Int {
return when(type) {
"add" -> { a, b -> a + b }
"multiply" -> { a, b -> a * b }
else -> { _, _ -> 0 }
}
}
示例
fun main() {
val operation = getOperation("add")
println(operation(2, 3)) // 输出5
}
4. 常见使用场景
回调机制
fun fetchData(callback: (String) -> Unit) {
// 模拟网络请求
Thread.sleep(1000)
callback("Data loaded")
}
策略模式
fun sort(list: List<Int>, comparator: (Int, Int) -> Boolean): List<Int> {
// 实现排序逻辑
}
5. 与Lambda表达式的结合
Kotlin提供了简洁的语法糖来简化高阶函数调用:
// 当Lambda是最后一个参数时,可以移到括号外
calculate(5, 3) { a, b -> a - b }
// 当Lambda是唯一参数时,可以省略括号
list.forEach { println(it) }
6. 性能考虑
虽然高阶函数提供了强大的表达能力,但需要注意:
- 每个Lambda表达式都会生成一个匿名类实例
- 可以使用
inline关键字优化性能(详见内联函数章节)
7. 实际案例
自定义高阶函数
fun <T> List<T>.customFilter(predicate: (T) -> Boolean): List<T> {
val result = mutableListOf<T>()
for (item in this) {
if (predicate(item)) {
result.add(item)
}
}
return result
}
// 使用
val numbers = listOf(1, 2, 3, 4, 5)
val evens = numbers.customFilter { it % 2 == 0 }
总结
高阶函数是Kotlin函数式编程的核心,通过将函数作为参数或返回值,可以极大地提高代码的灵活性和可重用性。结合Kotlin的Lambda表达式语法糖,可以写出既强大又简洁的代码。
提示:在Android开发中,高阶函数常用于事件处理、异步回调等场景;在后端开发中,常用于中间件、过滤器等实现。
