Kotlin 支持函数式编程,这意味着函数在 Kotlin 中被视为一等公民。它们可以被传递或从函数返回,就像任何其他变量一样。
所以,
protected var callbackFunction: ((Boolean) -> Unit) = {}
callbackFunction 是一个实现函数interface 的变量。您可以有效地说这是一个 lambda。要定义 lambda type,在: 之后,它需要一个Boolean 作为参数,在箭头-> 之后意味着它返回Unit,在Java 方面是void。在= 之后,我们给它一个带有花括号的主体。
这是调用时的样子:
class Test {
var callbackFunction: ((Boolean) -> Unit) = {}
fun higherOrderFunction(block: (Boolean) -> Unit) {
block(true)
}
}
fun main() {
Test().higherOrderFunction { it ->
println(it) //print true
}
}
如果我们查看字节码,我们可以看到它在后台做了什么:
反编译测试类
public final class Test {
@NotNull
private Function1 callbackFunction;
@NotNull
public final Function1 getCallbackFunction() {
return this.callbackFunction;
}
public final void setCallbackFunction(@NotNull Function1 var1) {
Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
this.callbackFunction = var1;
}
public Test() {
this.callbackFunction = (Function1)null.INSTANCE;
}
}
检查callbackFunction 是Function1 类型。现在,让我们看看Function1的声明。
/** A function that takes 1 argument. */
public interface Function1<in P1, out R> : Function<R> {
/** Invokes the function with the specified argument. */
public operator fun invoke(p1: P1): R
}
您可以将callbackFunction 变量传递给startListening() 抽象方法,因为此方法接受一个将布尔值作为参数并返回单位的lambda。所以,callbackFunction 匹配抽象方法的参数,我们现在可以传递它了。
我该如何解释?
- 您可以这样说,“callbackFunction 是一个 lambda,它接受 Boolean 作为参数并且不返回任何内容。”
在那个抽象函数中,回调类型是 Boolean 还是 Unit 还是其他?
- 它(再次)需要一个 lambda,需要一个布尔值作为参数并且不返回任何内容。
关于花括号。这是否意味着变量被一个空的匿名函数初始化?
- 就像我们可以给
abstract 声明添加花括号以给出具体的实现,我们也可以在这里做同样的事情。