functionA()和kotlin中的参数有什么不同

我有两个扩展方法

函数A是:

fun Activity.postDelay1s(run: () -> Unit) { Handler().postDelayed({ run() }, 1000) } 

functionB是:

 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)

我想在这两个扩展函数this::initData之间的initData()来区别

你可以像使用函数引用一样调用b( ::initData ),也可以使用类似下面的lambda:

 swipe.setUp(trade_list){ initData() } 

在大多数情况下不建议使用括号内的lambda也是可以的:

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

文档说:

在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且将一个lambdaexpression式作为相应的parameter passing,则可以在括号外指定它

也读这个线程 。

你的函数在参数( () -> Unit )中使用了相同的types,所以你可以用任何一种方式来调用它们。


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

 postDelay1s { initData() } 

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

用第二种语法:

 postDelay1s(this::initData) 

您正在传入对initData方法的引用 。 这样, initData方法接管了lambda在以前版本中所扮演的角色 – postDelay1s函数将直接调用此方法,而不需要额外的步骤。


这两种语法都可以和你的setUp方法一起使用。