函数A()之间的这个:: functionA与kotlin中的params有什么不同

时间:2018-02-01 09:37:09

标签: kotlin

我有两种扩展方法

功能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的不同之处

2 个答案:

答案 0 :(得分:2)

您可以使用function reference调用b(::initData),也可以使用lambda调用:

swipe.setUp(trade_list){
    initData()
}

也可以在括号内传递lambda,这在大多数情况下是不推荐的:

swipe.setUp(trade_list, { initData() })

Documentation说:

  

在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且你将一个lambda表达式作为相应的参数传递,你可以在括号之外指定它

另请阅读此thread

答案 1 :(得分:1)

您的函数在其参数(() -> Unit)中使用相同的类型,因此您可以以任何一种方式使用它们。

让我们看看第一种语法的作用:

postDelay1s { initData() }

这里你要创建一个新的lambda(匿名函数),它的主体只包含对initData函数的一次调用。您基本上是在代码中引入了额外级别的重定向。

使用第二种语法:

postDelay1s(this::initData)

您将[{3}}传递给initData方法。这样,initData方法接管了lambda在之前版本中所扮演的角色 - postDelay1s函数将直接调用此方法,而无需额外的步骤。

这两种语法也可以与setUp方法一起使用。