Kotlin闭包和java闭包的对比

前言:什么是闭包

花括号{} 内的代码块 如果访问了 外部的环境变量,则被称为一个闭包(引用自Kotlin核心编程)

一、kotlin的lambda 表达式对比java的内部类

  • Kotlin 闭包 和 java 的区别 是在于对 方法 局部变量的处理。kotlin可以修改局部变量的引用。
  • java 匿名内部类 ,访问的局部变量必须添加final声明 ,并且不能修改 方法局部变量的引用 。
  • java 匿名内部类的构造方法中把 局部变量 x的引用传递给了自己创建的变量 copyX 。实际访问的是copyX。
  • kotlin 使用了包装这一策略,将闭包访问到的局部变量包装成了一个新的对象。

二、java的匿名内部类的闭包

知乎上的一篇解析

三、Kotlin的闭包:上代码

class KotlinClouser {

    fun testCloser(func:()->Unit){
        func.invoke()
    }
    fun test(){
        var str:String = "hello"
        print(str)
        testCloser { str =" what ,kotlin 的闭包可以修改外部变量的引用?" }
        print(str)
    }


}
fun main() {
    var KotlinClouser: KotlinClouser = KotlinClouser()
    KotlinClouser.test()
}

反编译后的代码

public final class KotlinClouser
{

    public final void testCloser(Function0 func)
    {
        Intrinsics.checkParameterIsNotNull(func, "func");
        func.invoke();
    }

    public final void test()
    {
        // 这里将我们定义的 str 包装成了 ObjectRef 对象。
        // kotlin的闭包虽然可以修改局部变量的引用,但也产生了额外的性能消耗(包装操作)
        kotlin.jvm.internal.Ref.ObjectRef str = new kotlin.jvm.internal.Ref.ObjectRef();
        str.element = "hello";
        String s = (String)str.element;
        boolean flag = false;
        System.out.print(s);
        testCloser((Function0)new Function0(str) {

            public volatile Object invoke()
            {
                invoke();
                return Unit.INSTANCE;
            }

            public final void invoke()
            {
                $str.element = " what ,kotlin \u7684\u95ED\u5305\u53EF\u4EE5\u4FEE\u6539\u5916\u90E8\u53D8\u91CF\u7684\u5F15\u7528\uFF1F";
            }

            final kotlin.jvm.internal.Ref.ObjectRef $str;

            
            {
                $str = objectref;
                super(0);
            }
        }
);
        s = (String)str.element;
        flag = false;
        System.out.print(s);
    }

    public KotlinClouser()
    {
    }
}

四、总结:Kotlin 和java 对闭包的处理方式的不同。

  • Kotlin 通过包装局部变量 ,处理闭包的访问,java则是传递引用 。
  • Kolin 的闭包 比 java 的闭包开销 要大 ,所以Kotlin引入Inline 进行优化
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值