Kotlin lambda有几个参数

时间:2017-11-02 11:51:43

标签: java android lambda kotlin

我对kotlin lambda表达有点困惑。 找不到合适的答案。

在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

2 个答案:

答案 0 :(得分:8)

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

即可
myObject.setListener{p1, p2 -> false}

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

  1. 您有一对花括号太多setListener{{必须是setListener{。否则你会在lambda中创建一个lambda。
  2. 您再次删除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)