Kotlin:SAM杂谈

作者: 泪已无痕 | 来源:发表于2018-05-28 21:15 被阅读14次

SAM(Single Abstract Method)接口或函数式接口,指的是只有一个抽象方法的类或接口,其主要目的是为了以lambda的形式调用Java API,比如我们有以下Java接口:

public interface OnClickListener {
    void onClick(View view);
}

在Kotlin中,如果没有SAM转换,那么我们必须通过以下方式实现:

button.setOnClickListener(object: OnClickListener() {
    override fun onClick(view: View?) {
    }
})

有了SAM转换,我们就可以通过传递lambda的方式实现:

button.setOnClickListener { view -> }

通过对比,我们可以发现后一种方式的代码更为简洁,可是,除了代码看起来舒服之外,它们之间是否还有别的差异?且听我一一道来:

  1. 我们都知道第一种实现方式所创建的对象实例并不是全局唯一的,每次对象表达式被执行都会创建一个新的对象实例;而第二种方式,只要这个lambda没有访问任何来自定义它的函数的变量,那么这个lambda对应的内部类实例就是全局唯一的。
  2. 让我们先看下面一个例子:
view.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener() {
    override fun nGlobalLayout() {
        //do something...
        view.viewTreeObserver.removeOnGlobalLayoutListener(this)
    }
}

上面的例子中,我们最后移除监听器的时候通过this引用了匿名对象的实例,那么我们是否可以把上面的例子替换成下面的样子呢?

view.viewTreeObserver.addOnGlobalLayoutListener { 
    //do something...
    view.viewTreeObserver.removeOnGlobalLayoutListener(this) 
}

答案是不可以,对于编译器来说,lambda只是一个代码块,而不是一个对象,所以也就不能把它当作对象来引用,那么它内部的this到底指向何处呢?它指向包围这个lambda的类。

以上便是我对SAM的理解,如有疏漏,还请各位大大指出 ^ _ ^

相关文章

  • Kotlin:SAM杂谈

    SAM(Single Abstract Method)接口或函数式接口,指的是只有一个抽象方法的类或接口,其主要目...

  • kotlin SAM 优化,不注意就会踩坑!

    kotlin SAM 优化,不注意就会踩坑! 关键字:kotlin,SAM,优化,坑,object,singlet...

  • Kotlin Sam

    A SAM is an interface with a Single Abstract MethodSam是Ja...

  • Kotlin的SAM转换

    Java中的SAM Java8之后,我们将只有单一方法的接口称为SAM(Single Abstract Metho...

  • Kotlin:泛型杂谈(下)

    在Kotlin:泛型杂谈(上)中,从泛型扩展属性、非空约束、实例化类型参数三个方面简单介绍了一下Kotlin中泛型...

  • kotlin中sam(函数式接口)

    用lambda表达式去表示java中的匿名类实例在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如...

  • Kotlin中sam(函数式接口)解析

    用lambda表达式去表示java中的匿名类实例在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如...

  • kotlin 函数式接口 Functional(SAM) int

    一个接口如果仅仅有一个抽象的方法,那么这个接口被称为函数式接口或者仅有又一个抽象方法的接口(Single Abst...

  • sam格式详细说明

    The SAM Format Specification(sam格式说明) 1 The SAM Format Sp...

  • Kotlin中的sam(函数式接口)详解

    用lambda表达式去表示java中的匿名类实例在使用java去给一个按钮设置监听我们通常会通过创建匿名类实例,如...

网友评论

    本文标题:Kotlin:SAM杂谈

    本文链接:https://www.haomeiwen.com/subject/dgjnjftx.html