Raf*_*ael 5 java lambda android kotlin functional-interface
考虑以下代码:
val hwnd = Handler()
hwnd.postDelayed(object : Runnable {
override fun run()
hwnd.postDelayed(this, 5000)
}
}, 5000)
Run Code Online (Sandbox Code Playgroud)
这样,我可以通过this在run()方法中使用(指的是 Runnable)将相同的 Runnable 发布到 Handler 。但是我怎么能只使用一个 lambda 表达式来做同样的事情呢?
val hwnd = Handler()
hwnd.postDelayed({
//How to get "this" here?
}, 5000)
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?
由于默认的 lambda 转换为您提供了签名为 的 lambda () -> Unit,这意味着底层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)
Run Code Online (Sandbox Code Playgroud)
然后在调用方,您将获得Runnable对象作为 lambda 参数(仅参数it:):
hwnd.postDelayed(5000){
// it : Runnable
hwnd.postDelayed(it, 5000)
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想变得非常奇特,请将扩展参数更改为Handler.(Runnable) -> Unit,然后您将能够调用:
hwnd.postDelayed(5000){
// this : Handler, it : Runnable
postDelayed(it, 5000)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |