我有两种扩展方法
功能A是:
fun Activity.postDelay1s(run: () -> Unit) {
Handler().postDelayed({ run() }, 1000)
}
功能B是:
fun CustomRefreshLayout.setUp(containerRecycleView: RecyclerView, onResfresh: () -> Unit) {
with(this) {
recyclerView = containerRecycleView
setColorSchemeColors(Color.BLUE,
Color.GREEN,
Color.YELLOW,
Color.RED)
setDistanceToTriggerSync(300)
setProgressBackgroundColorSchemeColor(Color.WHITE)
setSize(SwipeRefreshLayout.LARGE)
setOnRefreshListener { onResfresh() }
}
}
当我调用函数a
时,我使用这种方式postDelay1s { initData() }
,但调用b
我需要使用这种方式swipe.setUp(trade_list, this::initData)
。
我想知道在这两个扩展函数中initData()
之间与this::initData
的不同之处
答案 0 :(得分:2)
您可以使用function reference调用b(::initData
),也可以使用lambda调用:
swipe.setUp(trade_list){
initData()
}
也可以在括号内传递lambda,这在大多数情况下是不推荐的:
swipe.setUp(trade_list, { initData() })
在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且你将一个lambda表达式作为相应的参数传递,你可以在括号之外指定它
另请阅读此thread。
答案 1 :(得分:1)
您的函数在其参数(() -> Unit
)中使用相同的类型,因此您可以以任何一种方式使用它们。
让我们看看第一种语法的作用:
postDelay1s { initData() }
这里你要创建一个新的lambda(匿名函数),它的主体只包含对initData
函数的一次调用。您基本上是在代码中引入了额外级别的重定向。
使用第二种语法:
postDelay1s(this::initData)
您将[{3}}传递给initData
方法。这样,initData
方法接管了lambda在之前版本中所扮演的角色 - postDelay1s
函数将直接调用此方法,而无需额外的步骤。
这两种语法也可以与setUp
方法一起使用。