将lambda存储在kotlin中的变量中

时间:2017-05-05 18:27:36

标签: android lambda kotlin

我开始使用kotlin在Android上开发,我有一个lambda问题。我有一个在我的视图中设置监听器的功能,如下所示:

fun setListener(listener: () -> Unit) {
}

问题是作为lambda传递的代码不会在setListener函数中执行,它将在我的代码的另一部分执行(特别是当选择了一个微调器的项目时)所以我必须“保存”或将此lambda“存储”到变量/属性中,以便我能够在需要时执行它。有关如何做到这一点的想法吗?

编辑:我通过以下方式实现了目标:

private var listener: (() -> Unit)? = null

fun setListener(listener: () -> Unit) {
    this.listener = listener
}

有更好的方法吗?感谢

3 个答案:

答案 0 :(得分:17)

以下是您可以这样做的方法:

class Foo {
    private var listener: () -> Unit = {}
    fun setListener(listener: () -> Unit) {
        this.listener = listener
    }
}

然而,在Kotlin中不鼓励手动编写setter。相反,您可以公开您的财产:

class Foo {
    var listener: () -> Unit = {}
}

供参考,以下是docs about properties,其中包含大量示例。

答案 1 :(得分:8)

您可以轻松地将功能存储在属性中。最简单的方法:

var listener: (() -> Unit)? = null

用法:

foo.listener = { println("called") }

如果您希望您的属性设置为仅限,则可以创建一个具有不可用getter的公共属性和一个供内部使用的私有属性。完整的例子:

class Example {

    // for internal use
    private var _listener: (() -> Unit)? = null

    // public set-only
    var listener: (() -> Unit)?
        @Deprecated(message = "set-only", level = DeprecationLevel.ERROR)
        get() = throw AssertionError() // unusable getter
        set(value) { _listener = value } // write-through setter

    fun somethingHappend() {
        _listener?.invoke()
    }
}

答案 2 :(得分:0)

这是一个简单的例子。

fun main(){
    val result=::sum //function assign to variable (first method)
    val result1: (first: Int, second: Int) -> Int=::sum //function assign to variable (second method)
    print(result(5,6))

}
fun  sum(first:Int,second:Int):Int{
    return first+second;
}