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

标签 kotlin lambda

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

在寻找API-29连接解决方​​案(NetworkInfo中已弃用getActiveNetworkInfoAPI-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;
   }
 }

检查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()抽象方法,因为此方法接受以Boolean作为参数并返回Unit的lambda。因此,callbackFunction与abstract方法的参数匹配,我们现在可以传递它。

How would I interpret this?


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

  • In that abstract function, is callback type of Boolean or Unit or something else?


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

  • 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/

    相关文章:

    android - 向 MediatorLiveData 添加多个源并更改其值

    c# - 用匿名方法定义backgroundworker的RunWorkerCompleted?

    kotlin - 不能使用 if/when 赋值来返回带有推断参数的 lambda,但可以使用 if/when block

    c++ - 函数参数包含完整的函数

    android - 如何使用 Dagger2 在 Android 中注入(inject) LifecycleOwner?

    kotlin - 如何在 Kotlin 中减去 2 个 float

    Android Studio 代码覆盖率未显示任何 Kotlin 类

    kotlin - 修改延迟结果

    java - 在访问作为引用的类成员时,lambda 表达式是否持有对其封闭实例的引用?

    c++ - 如何向 lambda 函数添​​加属性?