我正在使用Kotlin学习android开发。作为主要的Web开发人员,我对这两种技术都是陌生的。
在寻找API-29连接解决方案(NetworkInfo
中已弃用getActiveNetworkInfo
和API-29
)时,我在此表达式上进行了变量声明。
protected var callbackFunction: ((Boolean) -> Unit) = {}
abstract fun startListening(callback: (Boolean) -> Unit)
我将如何解释?我要说的是,变量callbackFunction是Boolean类型还是Unit类型。或者是其他东西。在该抽象函数中,回调类型是Boolean还是Unit或其他?
我也对花括号有点困惑。这是否意味着变量是由一个空的匿名函数(类似于JavaScript)初始化的,还是完全不同的概念?
最佳答案
Kotlin支持函数式编程,这意味着在Kotlin中将函数视为一等公民。就像任何其他变量一样,它们可以传递或从函数中返回。
所以,
protected var callbackFunction: ((Boolean) -> Unit) = {}
callbackFunction
是实现Function interface
的变量。您可以有效地说这是lambda。要定义lambda 类型,在:
之后,它将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()
抽象方法,因为此方法接受以Boolean作为参数并返回Unit的lambda。因此,callbackFunction
与abstract方法的参数匹配,我们现在可以传递它。How would I interpret this?
In that abstract function, is callback type of Boolean or Unit or something else?
about the curly braces. Does it mean variable is initialized by an empty anonymous function?
abstract
声明加上花括号以使其具体实现一样,我们可以在此处执行相同的操作。 关于kotlin - 有人可以解释这个Kotlin表达吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58250123/