Kotlin中onChanged: ((Int?) -> Unit)? = null参数含义及用法名称
onChanged: ((Int?) -> Unit)? = null 参数签名含义 我们逐段拆解这个签名的语义:
- 核心函数类型
(Int?) -> Unit:代表这是一个函数类型的参数,符合这个类型的函数需要接收1个Int?(可空整型)类型的入参,返回值为Unit(即无有效返回值,类似Java的void)。 - 外层包裹+可空标记
((Int?) -> Unit)?:这里的括号把整个函数类型包裹为一个整体,后面的?修饰的是整个函数类型,意思是onChanged这个参数本身可以为null。注意括号位置的区别:如果写成
(Int?) -> Unit?,代表的是函数返回值为可空的Unit类型,但参数本身不允许为null,和当前签名语义完全不同。 - 末尾的
= null:是Kotlin的参数默认值语法,给这个可空的函数参数设置默认值为null,意味着调用mySpecialFunction时可以完全省略onChanged参数,省略时该参数自动取null值,不会触发编译错误。
配合函数内部的onChanged?.invoke(2)逻辑,这套写法的运行逻辑是:只有当调用方真的传入了onChanged的实现时,才会执行传入的函数、把值2作为参数传给回调逻辑;如果调用方没传该参数、onChanged为null,这行代码会直接跳过,不会抛出空指针异常。
该用法的专业名称
这种写法属于Kotlin**高阶函数(Higher-Order Function)的典型应用场景:所谓高阶函数,就是可以将函数作为参数传入、或者将函数作为返回值的函数。
具体到这个带可空标记+默认null值的函数参数设计,是Kotlin实现可选回调(Optional Callback)的标准范式,用来替代Java中传入null作为事件监听器的常见写法,同时依托Kotlin的空安全机制避免了空指针风险。
补充说明:如果这个函数类型参数是函数参数列表的最后一个参数,Kotlin还支持尾随lambda(Trailing Lambda)**的简化写法,可以把传入的lambda逻辑移到函数调用的圆括号外面,代码可读性更高,示例中显式指定参数名、把lambda写在括号内的写法也是完全合法的。
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

