Kotlin lambda有几个参数

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)

gue*_*ter 9

在第一个示例中,只需删除即可 return@setListener

myObject.setListener{p1, p2 -> false}
Run Code Online (Sandbox Code Playgroud)

在你的第二个例子中,你必须要小心:

  1. 你有一对大括号太多setListener{{必须setListener{.否则你会在lambda中创建一个lambda.
  2. 你再次删除return.这是一个表达式主体,其中仅使用了结果参数.

     myObject.setListener{p1, p2 -> 
        if (p1) {
            true
        } else {
            false
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 6

如果我理解正确,您将遇到以下情况:

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)