首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么kotlin lambda被反编译成java代码是(Function0)null.INSTANCE

Kotlin是一种现代化的编程语言,它在语法和特性上与Java有所不同。Kotlin中的lambda表达式是一种函数式编程的特性,它允许我们以更简洁和灵活的方式处理函数。

当Kotlin的lambda表达式被编译成Java代码时,它会被转换为对应的Java函数接口。在这种情况下,Kotlin的lambda表达式会被转换为Function0接口的实例。Function0接口是Kotlin中表示无参数函数的接口。

在反编译过程中,将Kotlin代码转换为Java代码,如果lambda表达式没有捕获任何外部变量,它会被转换为一个静态的、不可变的实例。这个实例被表示为null.INSTANCE,其中null是Function0接口的实例,而.INSTANCE是Kotlin编译器生成的一个静态字段。

这种转换的好处是可以减少生成的Java代码的复杂性,并且在运行时可以更高效地处理lambda表达式。由于Kotlin的lambda表达式是基于Java函数接口的,因此在Java代码中使用Kotlin编写的lambda表达式时,可以直接调用对应的Java函数接口方法。

总结起来,kotlin lambda被反编译成Java代码是(Function0)null.INSTANCE的原因是为了在转换过程中简化代码结构,并且保持与Java函数接口的兼容性。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

说说kotlin的内联函数-inline

内联函数 定义:用关键字inline修饰的函数,叫做内联函数 作用:它们的函数体在编译器嵌入每一个调用的地方,减少额外生成匿名类和执行函数的开销 举个具体的例子:比如下面这个kotlin代码 fun...代码中this.foo((Function0)null.INSTANCE),如何跟匿名类扯上关系了 我们先看下Function0 /** A function that takes 0 arguments...extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions/Function0 class可以看出来,生成了匿名类TestKotlinmain1...:noinline 有一种可能函数需要接收多个参数,但我们只想对其中部分Lambda参数内联,其他的则不内联,这个又该如何处理呢?...代码 public final void main() { Function0 block2$iv = (Function0)null.INSTANCE; int $i$f$foo = false

97420

又被 Kotlin 语法糖坑惨的一天

源起同事的一次反馈,在提测期间报了一个 Kotlin.Lazy 的空指针异常,Lazy 的定义如下: class TestA{ ... val xxxx:Service?...为了避免太多代码的干扰,我们将涉及到 by lazy 使用的地方都拷贝到了一个 Test 类中,然后通过 Decompile 反编译成 Java 代码来查看是否 kotlin 的问题。...by lazy { AService() } } 反编译后的 Java 代码: public final class TestA { private final Lazy...public TestA() { // 1、初始化 Lazy 实例 .this.service$delegate = LazyKt.lazy((Function0)null.INSTANCE...为什么在方法里调用一个变量还会涉及到变量放置的位置,Kotlin 这高级语法糖恐怕连 C 都不如吧(嘲笑一番,哈哈)。 那 Kotlin 真的没有对其做语法检查吗?

52020
  • 聊聊Kotlin中的lambda

    表达式变成了创建一个Function0类并传入方法中 foo((Function0)null.INSTANCE); } //该方法参数变成了一个Function类 public static...其实java通过invokedynamic指令实现的,其本质运行时进行替换对应的Lambda中的代码 好处 1.运行时替换,相比较Kotlin直接写死创建类的方式性能更好 2.在class文件中只有这个指令...,不像kotlin需要设置很多不必要的信息 Kotlin的优化 为什么不去直接使用java的那个指令呢?...原因很简单,Kotlin基于java 6开发的,而java的这个优化java 7才出现的,所以为了兼容只能另辟蹊径。 虽然无法实现,但是我们可以借鉴java中的做法对吧?...inline关键字 Kotlin中可以使用inline将inline修饰的方法复制到调用方。inline修饰的方法也叫作内联函数。

    1.2K20

    浅谈Kotlin中的函数

    5.扩展函数 扩展函数类的一个成员函数,不过定义在类的外面 扩展函数不能访问私有的或者受保护的成员 扩展函数也是编译成静态函数 所以可以在Java库的基础上通过扩展函数进行封装,假装好像都是在调用Kotlin...7.Lambda表达式 Lambda本质上可以传递给其他函数的一小段代码,可以当成值到处传递 Lambda表达式以左大括号开始,以右大括号结束,箭头->分割成两边,左边入参,右边函数体。...,可以放到括号外边; 当Lambda函数唯一实参时,可以去掉调用代码中的空括号; 和局部变量一样,如果Lambda参数的类型可以推导出来,就不需要显示的指定。...9.Lambda表达式原理 自Kotlin 1.0起,每个Lambda表达式都会被编译成一个匿名类,除非它是一个内联Lambda。...toString() } with返回的值执行Lambda代码的结果,该结果Lambda中的最后一个表达式的值。如果想返回的接收者对象,而不是执行Lambda的结果,需要用apply函数。

    2.6K20

    重学 Kotlin —— inline,包治百病的性能良药?

    另外,Java 代码由 javac 编译的,Kotlin 代码由 kotlinc 编译的,而 JVM 可以对字节码做统一的内联优化。...拯救 Lambda 为什么要拯救 Lambda,我们首先得知道KotlinLambda 对于 JVM 而言究竟是什么。...经过编译器编译之后, runCatch() 方法中的 Lambda 参数替换为 Function0 类型,在 run() 方法中实际调用 runCatch() 时传入的参数实现了 Function0...总而言之,KotlinLambda 为了完全兼容到 Java6,不仅增大了编译代码的体积,也带来了额外的运行时开销。为了解决这个问题,Kotlin 提供了 inline 关键字。...Java 如何优化 Lambda 的? 既然 KotlinLambda 存在性能问题,那旁边的 Java 大兄弟肯定也逃脱不了。

    77120

    Java LambdaKotlin Lambda 的区别

    jdk 1.8 后 lambda 的实现是在当前类增加一个私有静态方法,减少了类的开销 Kotlin 匿名内部类的实现和 Java 一致也是在编译期生成一个 class,lambda 的实现也是同样创建一个...;)V final class test/Test32Kt$main$1 extends kotlin/jvm/internal/Lambda implements kotlin/jvm/functions...的 lamdba 执行效率高于 kotlin 的,因为它减少了类的开销。...那是不是可以把每个方法都进行内联修饰呢,答案不能,因为内联的预期性能影响微不足道的,内联最适用于具有函数类型参数的函数。 方法内联的意思在编译期对函数进行优化,以达到提高代码执行效率的作用。...方法内联一般出现在两个地方 1、class 编译期-》javac 编译期把代码编译成 class 对函数进行内联处理 2、JVM 运行期-》JIT(Just-in-time)即动态编译器,在编译时会把热点代码先预编译为机器码

    2.5K20

    AndroidStudio3 支持 Java8 了,就问你敢用吗

    首先说一下为什么以前我们不能用Java8的新特性,最主要的原因就是 lambda 语法。...lambda语法的代码编译以后,反编译它,可以看到变成了这样: protected void onCreate(Bundle savedInstanceState) { super.onCreate...} } 我们看到上面的代码,在编译后的run()方法内有一句MainActivity.lambdaonCreate0 上面的代码演示了纯函数(什么纯函数自己wiki)的操作,下面看一个非纯函数的。...在实现上跟Java也依旧一模一样,首先生成一个类,把lambda转换成对象,再调用这个对象的invoke()方法。...J8的支持,因为我最初以为他lambda body 的纯函数转换成静态方法,直接将 lambda 改成静态方法调用来做的,结果没想到还不如 kotlin

    92910

    5. 函数声明与闭包(Closure)

    闭包概念介绍 闭包我第一次接触在 JavaScript 上,函数当作“一等公民”的编程语言都有这个概念。函数“一等公民”的意思,函数和变量一样,它是某种类型的实例,可以赋值,可以引用。...Java8 lambda 进一步接近闭包的特性,lambda 的 JVM 实现是类似函数指针的东西。...但注意: Java7 的 lambda 语法糖兼容不是真正的 lambda,它只是简化了匿名类的书写。同样的 lambda 也只能引用 final 变量。 2..../Ref.javaJava 中,我们如果想要匿名类也可以操作外部变量,一般做法把这个变量放入一个 final 数组中。...总结 根据上面分析,我们可以了解到: 闭包不是新东西,把函数作为“一等公民”的编程语言的特性; 匿名类 Java 世界里的闭包,但有局限性,即只能读 final 变量,不能写任何变量; Kotlin

    1.1K20

    KotlinKotlinJava 互操作 ③ ( Kotlin 中处理 Java 异常 | Java 中处理 Kotlin 异常 | @Throws 注解处理异常 | 函数类型互相操作 )

    " 页面 , 点击顶部的 " Decompile " 按钮 , 将字节码数据反编译成 Java 代码 ; 在反编译后的 Java 代码中 , 存在 编译时 错误 ; 4、Kotlin 中捕获异常...FunctionN 接口 处理上述问题 , N 的取值范围 0 ~ 22 ; Function0 表示 函数有 0 个参数 ; Function1 表示 函数有 1 个参数 ; Function22...中 匿名函数代码示例 在 Kotlin 中 , 定义了 函数类型变量 , 下面的 KotlinMethod 类中 , 定义了 lambda 类型成员 , 该成员 函数类型变量 , 该 函数类型变量的...函数的类型 (String)->Unit ; 该 函数类型变量的 值 一个 匿名函数 / Lambda 表达式 / 闭包 ; class KotlinMethod { val lambda...; 3、Java 中 调用 Kotlin 匿名函数代码示例 在 Java 中 , 从 获取的 kotlin.jvm.functions.Function1 类型的变量 , 调用其 invoke 函数

    1.1K10

    Kotlin 程序设计》第六章 Kotlin 函数式编程(FP)第六章 Kotlin 函数式编程(FP)1. 函数式编程概述2. Kotlin函数式编程参考资料

    本质其实就是指令中断现场的地址的存储,执行完一段代码(函数逻辑)之后再返回执行之前的地址,继续执行下面的代码。 函数与闭包(匿名函数、无名函数) Kotlin 语言提供的重要特性之一。...而不像之前在Java中,要写上一堆样板代码。在Java 8中,也支持了Lambda表达式,写法简洁了许多了。... (Lkotlin/jvm/functions/Function0;)V 其中,$lambda-0() 函数签名如下: private final static kotlin$lambda-...Kotlin编译器在编译前端(即词法分析、语法分析、语义分析、中间代码生成)和Java基本一致的。与Java不同的地方在编译后面的目标代码生成环节。...Kotlin编译器在目标代码生成环节做了很多类似于Java封装的事情,比如自动生成Getter/Setter代码、Companion Object转变成静态类、修改类属性为final不可继承等等工作。

    59560

    KotlinKotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )

    * * @param reason一个解释为什么缺少实现的字符串。...(Hello.kt:2) at HelloKt.main(Hello.kt) 五、引号函数名 ---- Java 的函数名要求 : 只能由 字母数字下划线 构成 首字母并不能数字 不能关键字...Kotlin 中 函数名 可以使用 空格 , 特殊字符 , 关键字 , 前提 该函数名 必须使用 引号 ; 注意 KotlinJava 中的关键字不同 , 不管哪个语言的关键字 , 都不能作为函数名...返回值 , 可以写出 更加灵活的代码 ; Java 8 开始 支持 Lambda 表达式 , 但是 不支持 函数 作为参数 , 也 不支持将 函数 赋值给变量 ; Java 语言 将 函数 作为参数...的 替代方案 : 使用 匿名内部类 作为函数参数 ; 代码示例 : Java 代码中 , 接收 OnClickListener listener 类型的接口类型参数 , 在实际使用时 , 可以传入一个匿名内部类作为参数

    2K20

    Kotlin邂逅设计模式之单例模式(一)

    简述: 从这篇文章开始,我将带领大家一起来探讨一下Kotlin眼中的设计模式。说下为什么想着要开始这么一个系列文章。...2、Kotlin中设计模式的实现和Java的实现在某些方面还是有很大的差别的,利用Kotlin语言自身的特性实现设计模式比硬生生套用Java中的设计模式实现要更优雅和更高效。...KSingleton实例,不管有没有使用,只要KSingleton加载了, //静态代码块就会被调用,KSingleton实例就会被创建,并赋值给INSTANCE KSingleton...这门语言可谓操碎了心,做的很小心翼翼,为了不让Java开发者打破他们的调用习惯,让调用根本无法感知到Kotlin编写,因为外部调用方式和Java方式一样。..., (Function0)null.INSTANCE); } // $FF: synthetic method public KLazilyDCLSingleton(DefaultConstructorMarker

    96030

    From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了

    Kotlin 一种在 Java 虚拟机上运行的静态类型编程语言,称之为 Android 世界的Swift。 Kotlin 可以编译成Java字节码。...--- Kotlin 代码会被编译成Java字节码,所以和 Java 兼容 <img src="http://seachal-blog-picture-host.oss-cn-beijing.aliyuncs.com...<em>Kotlin</em> 当中的接口,<em>被</em>设计得更加强大了。 在 <em>Java</em> 1.8 版本当中,<em>Java</em>接口也引入了类似的特性。...因为<em>Kotlin</em> 默认嵌套类(B类)<em>是</em>一个静态内部类 <em>Kotlin</em> 嵌套类反<em>编译成</em> <em>Java</em> <em>代码</em>: <img src="http://seachal-blog-picture-host.oss-cn-beijing.aliyuncs.com...Kotlin对此并没有进行限制,但是通常不建议在Lambda 表达式中编写太长的代码,否则可能会影响代码的可读性。 Lambda也可以理解为匿名函数的简写。

    1.3K80

    Kotlin】函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )

    ---- 1、Lambda 表达式弊端 Lambda 表达式弊端 : Lambda 表达式 的 灵活使用 , 是以 牺牲内存开销为代价的 ; 在 Java 虚拟机中 , Lambda 表达式 是以 实例对象...Lambda 表达式的 内存开销 问题 , 将 使用 Lambda 表达式 作为参数的函数 定义为 inline 内联函数 , Java 虚拟机就 不会再为 lambda 表达式 在堆内存中 创建 实例对象...--- 代码示例 : 下面的代码中 studentDoSomething 普通函数 ; fun main() { // 定义函数类型变量, 之后作为函数参数传递给函数 val actionFun...代码内容如下 : import kotlin.Metadata; import kotlin.jvm.functions.Function2; import kotlin.jvm.internal.Intrinsics...---- 代码示例 : 下面的代码中 studentDoSomething 内联函数 ; fun main() { // 定义函数类型变量, 之后作为函数参数传递给函数 val actionFun

    1.3K10

    如何为 Gradle 的 KTS 脚本添加扩展?

    我认为这段代码定义中最有趣的 Stage1Sequence,它通过类型的形式强制给出了几个代码块的顺序的定义。...简单来说就是任意一个 Kotlin DSL 的 Gradle 脚本都会把分属于不同阶段的部分拆分开,每一个部分都会编译成两个类,叫做 Program 和 Build_gradle,其中 Program...类的 execute 函数调用入口,DSL 脚本的内容则编译成 Build_gradle 类的构造函数。...而且需要特别注意的,我们会在 classpath 阶段的 buildscript 代码块中添加 classpath,所以这个阶段与 body 阶段运行时的 classpath 不一样的,因此不是所有在...需要注意的,我们的示例基于 Gradle 7.0 的,不同版本可能会存在差异。 2.4 如果 Groovy 呢? 之所以这么麻烦,就是因为我们需要兼顾 Kotlin 的静态类型的特性。

    1.4K20
    领券