有人可以解释这个Kotlin表达吗?

Abh*_*tha 1 lambda kotlin

我正在使用Kotlin学习android开发。作为主要的Web开发人员,我对这两种技术都是陌生的。

在寻找API-29连接解决方​​案(NetworkInfogetActiveNetworkInfo中已弃用API-29)时,我遍历了该表达式以进行变量声明。

 protected var callbackFunction: ((Boolean) -> Unit) = {}

 abstract fun startListening(callback: (Boolean) -> Unit)
Run Code Online (Sandbox Code Playgroud)

我将如何解释?我说的是,变量callbackFunction是Boolean类型还是Unit类型。或者是其他东西。在该抽象函数中,回调类型是Boolean还是Unit或其他?

我也对花括号有点困惑。这是否意味着变量是由空的匿名函数(类似于JavaScript)初始化的,还是完全不同的概念?

Tas*_*mad 5

Kotlin支持函数式编程,这意味着在Kotlin中将函数视为一等公民。就像任何其他变量一样,它们可以传递或从函数中返回。

所以,

 protected var callbackFunction: ((Boolean) -> Unit) = {}
Run Code Online (Sandbox Code Playgroud)

callbackFunction是实现Function的变量interface。您可以有效地说这是lambda。要定义的λ ,之后:,它需要一个Boolean作为参数,并之后箭头->意味着它返回Unit其是void在Java中的术语。之后=,我们给它一个带有花括号的主体。

调用时的外观如下:

 class Test {
    var callbackFunction: ((Boolean) -> Unit) = {}
    fun higherOrderFunction(block: (Boolean) -> Unit) {
         block(true)
     }
   }

   fun main() {
      Test().higherOrderFunction { it ->
          println(it) //print true
      }  
   }
Run Code Online (Sandbox Code Playgroud)

如果我们看一下字节码,我们可以看到它在做什么:

反编译测试类

  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;
   }
 }
Run Code Online (Sandbox Code Playgroud)

检查callbackFunctionFunction1类型。现在,让我们看看的声明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
}
Run Code Online (Sandbox Code Playgroud)

您可以将callbackFunction变量传递给startListening()抽象方法,因为该方法接受将布尔作为参数并返回Unit的lambda。因此,callbackFunction匹配abstract方法的参数,我们现在可以传递它。

我将如何解释?

  • 您可以说,“ callbackFunction是一个以Boolean为参数且不返回任何内容的lambda”。

在该抽象函数中,回调类型是Boolean还是Unit或其他?

  • 再次需要一个lambda,它需要一个布尔值作为参数并且什么都不返回。

关于花括号。这是否意味着变量由空的匿名函数初始化?

  • 就像我们可以在abstract声明中使用花括号以使其具体实现一样,我们可以在此处执行相同的操作。