如何在Kotlin中将函数声明为变量

Lea*_*ira 4 functional-programming listener kotlin

所以我想在Kotlin创建一个监听器.我只想传递一个将在我的代码中执行的方法.像这样:

override fun setButtonClickListener(listener: (text: String) -> Unit) {
    this.listener = listener
}
Run Code Online (Sandbox Code Playgroud)

但是,当我宣布我的听众时,我必须这样声明:

private var listener : (text: String) -> Unit = null!!
Run Code Online (Sandbox Code Playgroud)

否则我的AS会抱怨.但是这个 !!在一个null对象接缝这么奇怪.我该如何声明这个监听器?

谢谢!

hol*_*ava 16

有很多方法可以将函数声明为kotlin中的变量.

您可以使用lateinit属性在以后初始化属性,例如:

private lateinit var listener : (text: String) -> Unit
Run Code Online (Sandbox Code Playgroud)

或者可以为listener空,但你必须使用安全调用来调用它:listener?.handle(...)这样:

private var listener : ((text: String) -> Unit)? = null
Run Code Online (Sandbox Code Playgroud)

或者使用空lambda声明它以避免NPException,例如:

private var listener : (String) -> Unit = {}
Run Code Online (Sandbox Code Playgroud)

或者声明一个私有函数,然后你可以通过函数引用表达式引用它,例如:

private var listener = this::handle

private fun handle(text:String) = TODO()
Run Code Online (Sandbox Code Playgroud)

注意:声明函数变量时,参数名称是可选的,例如:

private var listener : (text:String) -> Unit = TODO()
//                      |--- parameter name is omitted
private var listener : (String) -> Unit = TODO()
Run Code Online (Sandbox Code Playgroud)