简单记录一下高阶函数和函数类型,特别是带返回值的匿名函数与 Lambda 表达式的区别。
记录于此,方便自己查阅。
正文
函数
val sumf = fun(a: Int, b: Int) = { a + b }语法解析:这里使用的是 匿名函数(Anonymous Function),而不是 Lambda 表达式
// Lambda 通常是 val sumf = { a: Int, b: Int -> a + b }
执行逻辑:
fun(a: Int, b: Int) = { a + b }的含义是:这个函数接收两个
Int参数a和b。它的返回值不是一个
Int,而是一个 Lambda 表达式{ a + b }。因为这个 Lambda 没有参数,所以类型是
() -> Int。因此,整个表达式的类型是
(Int, Int) -> (() -> Int),即“接收两个 Int 参数,返回一个无参且返回 Int 的函数”。
怎么使用sumf?
sumf输出:
(kotlin.Int, kotlin.Int) -> () -> kotlin.Int解释:这正是上面说的类型。它是一个高阶函数,因为它返回了另一个函数。
sumf(1, 1)输出:
() -> kotlin.Int解释:调用
sumf(1, 1)时,参数a和b被赋值为 1,函数体执行{ a + b },也就是{ 1 + 1 },即{ 2 }。但在 Kotlin 中,Lambda 表达式本身就是一个对象,所以这里返回的是一个“无参、返回值为 2 的函数对象”,而不是直接的数值2。
sumf(1, 1).invoke()输出:
2解释:
.invoke()是 Kotlin 中调用函数对象的显式方式。它执行了那个返回的函数{ 2 },所以最终输出2。
sumf(1, 1)()输出:
2解释:这是 Kotlin 提供的语法糖,等同于
.invoke()。圆括号直接作用于函数对象,效果一样。
匿名函数 vs Lambda
你可能会疑惑,为什么写成 fun(...) = { ... }会变成这样?
Lambda 表达式:
val f = { a: Int, b: Int -> a + b }→ 类型是(Int, Int) -> Int。它直接返回计算结果。匿名函数:
val f = fun(a: Int, b: Int) = { a + b }→ 类型是(Int, Int) -> (() -> Int)。因为它把{ a + b }当作表达式,而这个表达式本身是一个 Lambda,所以它返回的是 Lambda。
通俗理解:
Lambda 表达式
{ a, b -> a + b }是一个“值”(函数对象)。fun(a, b) = { a + b }的意思是:“定义一个函数,它接收 a 和 b,然后返回那个 Lambda 值”。
总结
| 代码 | 含义 | 结果类型 | 说明 |
|---|---|---|---|
fun(a: Int, b: Int) = { a + b } | 定义匿名函数 | (Int, Int) -> (() -> Int) | 返回的是一个 Lambda |
sumf(1, 1) | 调用函数,传入 1, 1 | () -> Int | 得到的是 { 2 }这个对象 |
sumf(1, 1)() | 调用返回的 Lambda | Int | 最终得到值 2 |
高阶函数(因为它返回函数)”,它的类型是高阶函数类型。

![[转]android NTP时间同步](https://www.biumall.com/wp-content/themes/BiuX/assets/images/random/0.webp)