在Java中,我可以使用如下参数设置一个监听器:
myObject.setListener(new MyListener() {
@Override
public boolean doSmth(int pos, int value) {
switch(..) {
....
}
}
})
使用lambda:
myObject.setListener((p1, p2) -> {
switch(..) {
....
}
})
在Kotlin,我可以这样做:
myObject.setListener{p1, p2 -> return@setListener false}
或
myObject.setListener{{p1, p2 ->
if (p1) {
return@setListener true
} else {
return@setListener false
}
}}
但它真的很难看。有没有办法让它更容易? 我可以像这样使用smth:
myObject.setListener{p1, p2 -> myFunc(p1, p2)}
但是,如果我想将我的逻辑放入听众中(它可能很复杂,而不仅仅是if else return
)
答案 0 :(得分:8)
在第一个示例中,只需删除return@setListener
myObject.setListener{p1, p2 -> false}
在你的第二个例子中,你必须要小心:
setListener{{
必须是setListener{
。否则你会在lambda中创建一个lambda。您再次删除return
。这是一个表达式主体,只使用结果参数。
myObject.setListener{p1, p2 ->
if (p1) {
true
} else {
false
}
}
答案 1 :(得分:4)
如果我理解正确,你会有这样的事情:
fun setListener(f: (Int, Int) -> Boolean) {
f(1, 2)
}
setListener { p1, p2 -> true }
当然,您可以将逻辑提取到另一个函数中:
fun logic (i: Int, i2: Int) :Boolean {
//complex stuff
return true
}
setListener(::logic)