Использование Lambda в Kotlin 3. Преобразование SAM (преобразование одного абстрактного метода)

1. Функциональный интерфейс

        Интерфейс , определяющий только один абстрактный метод, называется функциональным интерфейсом (интерфейс SAM) . Функциональный интерфейс может иметь несколько неабстрактных методов, но только один абстрактный метод. Например: в Java

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

   В котлине ( функциональные интерфейсы не поддерживаются до версии котлина 1.4, но поддерживаются только после 1.4 ): объявлено через ключевое слово fun 

@FunctionalInterface
    fun interface OnClickListener {
        fun onTouch(v: View){
            print("onTouch")
        }
        fun onClick(v: View?)
    }

        Чтобы избежать добавления других абстрактных методов в объявленный функциональный интерфейс, вы можете использовать ограничение аннотации @FunctionalInterface . Если вы добавите другие абстрактные методы в квадратный интерфейс, компилятор сообщит об ошибке.

        Функциональные интерфейсы могут реализовывать преобразование SAM через лямбда-выражения, делая код более кратким и читабельным. Лямбда-выражения могут заменить создание вручную классов, реализующих функциональные интерфейсы. Тип функции лямбда-выражения Котлина должен соответствовать типу единственного абстрактного метода функционального интерфейса .

2. Способ построения ЗРК

        Конструктор SAM можно использовать для отображения лямбда-выражений, которые преобразуются в экземпляры функциональных интерфейсов (типы функций согласованы). Он также может быть автоматически преобразован компилятором .

        (1) Преобразование дисплея с помощью метода построения SAM.

fun main(args: Array<String>) {
        //val interfaceObject = View.OnClickListener({ v: View -> print("------") })
        //上边代码可以简化为
        val interfaceObject = View.OnClickListener { print("------") }
        textView.setOnClickListener(interfaceObject)
    }

        (2) Автоматическое преобразование с помощью компилятора.

 fun main(args: Array<String>) {
        textView.setOnClickListener { print("----") }
    }

        До версии kotlin 1.4, когда функция получала несколько функциональных интерфейсов, необходимо было использовать метод конструктора SAM для явного преобразования или одновременно использовать автоматическое преобразование. (После Kotlin 1.4 ограничений по времени нет)

fun multiInterface(l: OnClickListener, runnable: Runnable) {
}
fun main(args: Array<String>) {
    multiInterface({}, {})
    //或者
    multiInterface(OnClickListener{}, Runnable{})
}

      

1. Введение в использование лямбда-выражений в функциональном API коллекции.

2. Типы функций и создание экземпляров

3. Преобразование SAM (преобразование одного абстрактного метода)

4.
Встроенная

рекомендация

отblog.csdn.net/old_land/article/details/119573415