Kotlin中initData()与this::initData在扩展函数调用中的差异咨询
关于Kotlin中
initData()与this::initData的差异解析 嘿,我来帮你拆解这两种写法的核心区别,其实本质上是Kotlin里函数调用和函数引用的差异,咱们结合你的代码场景慢慢说:
1. postDelay1s { initData() }里的initData()
这里的{ initData() }是一个Lambda表达式,相当于一个匿名的小任务。当你在Lambda里写initData()时,你是把「调用initData()」这个动作封装在了Lambda里面——注意,这个initData()并不会立刻执行,而是要等Lambda被触发的时候(也就是你的postDelay1s函数里的postDelayed到点执行时)才会真正调用initData()。
简单说:你给postDelay1s传递的不是initData函数本身,而是一个“会调用initData的小任务”。
2. swipe.setUp(trade_list, this::initData)里的this::initData
这里的this::initData是Kotlin的函数引用语法,它直接指向initData这个函数本身,而不是执行它的结果。
你的setUp函数第二个参数需要的是一个() -> Unit类型的函数(也就是无参、返回值为Unit的函数),而this::initData刚好匹配这个类型——相当于你把initData函数作为一个“变量”传递给了setUp,由setUp内部的setOnRefreshListener来决定什么时候调用它(也就是用户下拉刷新的时候)。
这种写法比写{ initData() }更简洁,语义也更直接:我就是要把initData这个函数传过去,不是传一个封装了调用动作的Lambda。
核心差异总结
initData():是一个函数调用动作,它的结果是Unit。你把它放在Lambda里,是让Lambda在执行时帮你完成这个调用。this::initData:是函数本身的引用,它的类型是() -> Unit,可以直接作为参数传递,由接收这个引用的代码决定何时执行函数。
举个更直白的例子辅助理解:
// 写法1:用Lambda封装调用动作 val task1 = { initData() } task1() // 此时才会调用initData() // 写法2:直接引用函数 val task2 = this::initData task2() // 同样会调用initData(),但task2是直接指向原函数
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

