Too*_*azy 4 java lambda android kotlin
我对kotlin lambda表达有点困惑.找不到合适的答案.
在Java中,我可以使用这样的参数设置一个监听器:
myObject.setListener(new MyListener() {
@Override
public boolean doSmth(int pos, int value) {
switch(..) {
....
}
}
})
Run Code Online (Sandbox Code Playgroud)
使用lambda:
myObject.setListener((p1, p2) -> {
switch(..) {
....
}
})
Run Code Online (Sandbox Code Playgroud)
在Kotlin,我可以这样做:
myObject.setListener{p1, p2 -> return@setListener false}
Run Code Online (Sandbox Code Playgroud)
要么
myObject.setListener{{p1, p2 ->
if (p1) {
return@setListener true
} else {
return@setListener false
}
}}
Run Code Online (Sandbox Code Playgroud)
但它真的很难看.有没有办法让它更容易?我可以像这样使用smth:
myObject.setListener{p1, p2 -> myFunc(p1, p2)}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想将我的逻辑放入听众中(它可能很复杂,而不仅仅是if else return)
在第一个示例中,只需删除即可 return@setListener
myObject.setListener{p1, p2 -> false}
Run Code Online (Sandbox Code Playgroud)
在你的第二个例子中,你必须要小心:
setListener{{必须setListener{.否则你会在lambda中创建一个lambda.你再次删除return.这是一个表达式主体,其中仅使用了结果参数.
myObject.setListener{p1, p2 ->
if (p1) {
true
} else {
false
}
}
Run Code Online (Sandbox Code Playgroud)如果我理解正确,您将遇到以下情况:
fun setListener(f: (Int, Int) -> Boolean) {
f(1, 2)
}
setListener { p1, p2 -> true }
Run Code Online (Sandbox Code Playgroud)
当然,您可以将逻辑提取到另一个函数中,如下所示:
fun logic (i: Int, i2: Int) :Boolean {
//complex stuff
return true
}
setListener(::logic)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3071 次 |
| 最近记录: |