如何理解Kotlin匿名函数的使用场景及灵活多变的语法规则?
Kotlin 匿名函数语法疑问解答
你遇到的是Kotlin的尾随Lambda表达式语法糖,专门针对最后一个参数为函数类型的函数设计,规则如下:
当函数的最后一个参数是函数类型时,作为实参传入的Lambda表达式可以移动到函数调用的括号外侧;如果该函数仅有一个参数且为函数类型,括号可以直接省略。
示例代码对应解释
你给出的代码里,写在setItems()括号外的Lambda本质就是setItems方法的第二个参数,完全等价于你熟悉的Java写法:
Java写法:
builder.setItems(sources, new callbackFunc {...})
对应Kotlin的非语法糖写法:
builder.setItems(sources, { _, which -> when (which) { 0 -> { cameraIntentLauncher.launch(cameraIntent) } 1 -> { galleryIntentLauncher.launch(galleryIntent) } } }).create().show()
用尾随Lambda语法糖简化后就是你看到的写法,逻辑完全一致,没有额外绑定回调的步骤,这个Lambda本身就是setItems要求的点击回调参数。
尾随Lambda适用&禁用场景
- 适用场景:
- 函数的最后一个参数为函数类型,或最后一个参数是SAM接口(单抽象方法接口,比如Android的各种点击回调)且你用Lambda作为实参传入
- 如果函数只有唯一一个参数且为函数类型,可以直接省略括号写Lambda,比如
view.setOnClickListener { ... }、apply { ... }都是这类用法
- 禁用场景:
- 函数最后一个参数不是函数类型/SAM接口,不能用该语法
- 多个函数类型参数传入时,只有最后一个可以放到括号外,其余参数必须写在括号内
学习路径
- 先系统学习Kotlin官方中文文档中「Lambda表达式与高阶函数」「SAM转换」「作用域函数」三个关联章节,理清语法规则
- 自己写简单Demo验证语法:自定义包含函数类型参数的方法,分别用括号内传参、尾随Lambda两种写法调用,对比差异
- 阅读常用Kotlin开源项目代码,遇到陌生语法随时对照规则验证,见得多了就能快速识别
内容的提问来源于stack exchange,提问作者Bungles
相关产品推荐
相关产品推荐

