java – 在lambda函数中获取接口引用
作者:互联网
请考虑以下代码:
val hwnd = Handler()
hwnd.postDelayed(object : Runnable {
override fun run()
hwnd.postDelayed(this, 5000)
}
}, 5000)
这样,我可以通过在run()方法中使用this(指的是Runnable)将相同的Runnable发布到Handler.但是我怎么能只使用lambda表达式呢?
val hwnd = Handler()
hwnd.postDelayed({
//How to get "this" here?
}, 5000)
这甚至可能吗?
解决方法:
由于默认的lambda转换为lambda提供了签名为() – >单位,表示底层的Runnable完全隐藏.
您必须要么处理手动对象创建,要么编写一个包装器扩展函数,它将使用带有另一个签名的lambda:
// custom extension function for handler
inline fun Handler.postDelayed(delayMilis: Long, crossinline runnable: (Runnable) -> Unit) = postDelayed(object : Runnable{
override fun run() {
runnable(this)
}
}, delayMilis)
然后在调用端,您将获得Runnable对象作为lambda参数(仅参数:it):
hwnd.postDelayed(5000){
// it : Runnable
hwnd.postDelayed(it, 5000)
}
或者如果你想变得非常花哨,可以将扩展参数更改为Handler.(Runnable) – >单位,然后你就可以打电话:
hwnd.postDelayed(5000){
// this : Handler, it : Runnable
postDelayed(it, 5000)
}
标签:functional-interface,android,java,lambda,kotlin 来源: https://codeday.me/bug/20190823/1697297.html