【问题标题】:Can someone explain this Kotlin expression?有人可以解释这个 Kotlin 表达式吗?
【发布时间】:2019-10-07 04:00:33
【问题描述】:

我正在学习使用 Kotlin 进行 Android 开发。作为一名主要的网络开发人员,我对这两种技术都很陌生。

在寻找 API-29 连接解决方​​案(NetworkInfogetActiveNetworkInfoAPI-29 中已弃用)时,我遇到了这个用于变量声明的表达式。

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

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

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

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

【问题讨论】:

  • 是一个空的lambda,满足一个参数不返回的要求。 callbackFunction 的类型是一个用布尔值回调的函数。

标签: kotlin lambda


【解决方案1】:

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

检查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() 抽象方法,因为此方法接受一个将布尔值作为参数并返回单位的lambda。所以,callbackFunction 匹配抽象方法的参数,我们现在可以传递它了。

我该如何解释?

  • 您可以这样说,“callbackFunction 是一个 lambda,它接受 Boolean 作为参数并且不返回任何内容。”

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

  • 它(再次)需要一个 lambda,需要一个布尔值作为参数并且不返回任何内容。

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

  • 就像我们可以给abstract 声明添加花括号以给出具体的实现,我们也可以在这里做同样的事情。

【讨论】:

  • 你太棒了.. 谢谢。我知道这是 lambda,但无法正确解释表达式。很困惑,因为我不知道函数可以分配给类似于 javascript 的变量。我讨厌 lambdas 的神秘性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2013-01-09
  • 2012-04-19
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多