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️⃣ 协程中的 launchwithContext 都是高阶函数

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, launchAndroid / 协程等

更多推荐