kotlin lambda表达式和高阶函数
·
Lambda 表达式 和 高阶函数
🧩 一、Lambda 表达式是什么?
Lambda 表达式 本质上就是一个“匿名函数”
👉 可以像对象一样被当作参数传递、返回或存储。
语法形式:
{ 参数列表 -> 函数体 }
例子:
val add = { a: Int, b: Int -> a + b }
println(add(3, 5)) // 输出:8
这和普通函数是等价的:
fun add(a: Int, b: Int): Int = a + b
🧠 二、什么是高阶函数(Higher-Order Function)
高阶函数就是:以函数作为参数,或返回一个函数的函数。
简单理解:
- 参数可以是函数(别人传进来一个函数)
- 返回值也可以是函数(我返回一个函数)
✅ 示例 1:函数作为参数(最常见)
// 定义一个高阶函数
fun operate(x: Int, y: Int, action: (Int, Int) -> Int): Int {
return action(x, y) // 调用传进来的函数
}
// 使用:传入不同的 Lambda 实现不同逻辑
val result1 = operate(5, 3) { a, b -> a + b } // 加法
val result2 = operate(5, 3) { a, b -> a * b } // 乘法
println(result1) // 8
println(result2) // 15
解释:
operate()是高阶函数,因为它接收一个函数参数action- 调用时我们传入不同的 Lambda,逻辑会变化(“策略模式”思想)
✅ 示例 2:函数作为返回值
fun makeMultiplier(factor: Int): (Int) -> Int {
return { number -> number * factor }
}
val times2 = makeMultiplier(2)
val times3 = makeMultiplier(3)
println(times2(5)) // 10
println(times3(5)) // 15
解释:
makeMultiplier返回一个函数(Int) -> Int- 每个返回的函数都“记住”了 factor(闭包)
- 这其实是 闭包 + 高阶函数 的组合应用(Compose、Flow 等底层都在用)
✅ 示例 3:结合 Kotlin 标准库函数
Kotlin 标准库大量使用高阶函数,比如:
val list = listOf(1, 2, 3, 4, 5)
// forEach:传入函数参数
list.forEach { println(it) }
// filter:函数返回 Boolean
val evens = list.filter { it % 2 == 0 }
// map:函数返回映射值
val squares = list.map { it * it }
println(evens) // [2, 4]
println(squares) // [1, 4, 9, 16, 25]
👉 所有这些 forEach, map, filter 都是典型的高阶函数。
🧠 三、Kotlin 如何定义高阶函数?
语法上很简单:
fun <参数名>(函数类型参数: (参数类型) -> 返回类型): 返回类型
例子:
fun doSomething(action: () -> Unit) {
println("before")
action() // 执行传入的函数
println("after")
}
doSomething { println("doing something") }
输出:
before
doing something
after
⚙️ 四、函数类型与语法简化
函数类型语法:
(Int, String) -> Boolean
也可以有返回 Unit:
() -> Unit
示例:
val listener: (String) -> Unit = { msg -> println("msg: $msg") }
listener("hello") // msg: hello
🔥 五、在 Android 中的实际使用场景
1️⃣ View 点击监听(传统写法 vs Lambda)
// 旧写法
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
println("clicked!")
}
})
// Kotlin 写法(高阶函数 + Lambda)
button.setOnClickListener {
println("clicked!")
}
👉 setOnClickListener 的参数是一个函数接口,因此可以直接传入 Lambda。
2️⃣ 协程中的 launch、withContext 都是高阶函数
GlobalScope.launch {
val data = withContext(Dispatchers.IO) {
loadDataFromNetwork() // Lambda 块
}
println(data)
}
launch { ... } 和 withContext { ... } 都接收一个 Lambda 参数。
3️⃣ Flow 操作符(典型高阶函数链式使用)
flowOf(1, 2, 3, 4)
.filter { it % 2 == 0 } // 传入函数参数
.map { it * it } // 再次传入函数参数
.collect { println(it) } // 最终消费
🧩 六、总结一句话(面试速答版)
Kotlin 的高阶函数是指“以函数作为参数或返回值的函数”,
它配合 Lambda 表达式可以让代码更加简洁、灵活。
典型例子包括:map,filter,forEach,launch,setOnClickListener等。
✅ 快速对比总结表:
| 特性 | 示例 | 含义 |
|---|---|---|
| Lambda | { x -> x + 1 } | 匿名函数 |
| 高阶函数 | fun operate(f: (Int) -> Int) | 接收/返回函数 |
| 闭包 | val add = makeAdder(5) | 捕获外部变量 |
| 常见场景 | map, filter, onClick, launch | Android / 协程等 |
更多推荐
所有评论(0)