将lambda存储在kotlin的变量中

我正在用kotlin开始在Android上开发,并且在lambdas中遇到问题。 我有一个函数来设置一个监听器在我看来,这看起来像这样:

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

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

编辑:我已经做到了:

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

有没有更好的方法来做到这一点? 谢谢

你可以这样做:

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

但是,Kotlin不鼓励手动编写setter。 相反,你可以公开你的财产:

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

作为参考,这里是有很多例子的属性的文档 。

你可以很容易的在一个属性中存储一个函数。 最简单的方法是:

 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() } }