前言
使用Kotlin时对有些函数的参数很迷糊,似懂非懂,比如下面的
fun doSomething(callback: () -> Any) { val r = callback() // 调用回调,拿到返回值 println(r) // 打印结果 }
使用
doSomething { "Hello from callback" } // 输出:Hello from callback
或者
doSomething { 42 } // 输出:42
对于参数callback: () -> Any和上面调用方式看上去很迷惑,今天简单整理一下,方便自己查阅。
正文
下面先对
callback: () -> Any其中的()和Any简单介绍一下。
()
空参数列表 无参
显示常见的函数参数
| 写法 | 含义 |
|---|---|
| () -> Any | 无参,返回 Any |
| (Int) -> Any | 一个 Int 参数,返回Any |
| (String, Int) -> Boolean | 两个参数,返回 Boolean |
Any
`Any`不是“不确定”,而是“最宽松”,可以返回任意值Any是 Kotlin 的“根类型”,类似 Java 的 Object。
所以当你写:
() -> Any等于:
我不管你具体返回啥,反正我能接住它
参数
回到callback: () -> Any做参数时
fun doSomething(callback: () -> Any) { val r = callback() println(r) }
调用的时候,你传的那个 lambda,就是 callback本身:
doSomething { "我其实是个 String" }
等价于:
val callback: () -> Any = { "我其实是个 String" } val r = callback() println(r)
所以:lambda 的“最后一行” = callback()的返回值
注意
即使你写:
doSomething { println("hi") 42 }
✅ 返回值是 42
❌ 不是 Unit,也不是 println的结果
因为 lambda 的返回值 = 最后一行表达式的值
参考文字
- AI

![[摘]Java垃圾回收机制(GC)详解](https://www.biumall.com/wp-content/themes/BiuX/assets/images/random/0.webp)