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

时间:2019-10-05 16:16:22

标签: kotlin lambda

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

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

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

 abstract fun startListening(callback: (Boolean) -> Unit)

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

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

1 个答案:

答案 0 :(得分:5)

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

所以

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

callbackFunction是实现功能interface的变量。您可以有效地说这是lambda。要定义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
      }  
   }

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

反编译测试类

  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;
   }
 }

检查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
}

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

  

我将如何解释?

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

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

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

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

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