El uso de Lambda en Kotlin 3. Conversión SAM (Conversiones de método abstracto único)

1. Interfaz funcional

        Una interfaz que define solo un método abstracto se llama interfaz funcional (interfaz SAM) . Una interfaz funcional puede tener múltiples métodos no abstractos, pero solo un método abstracto. Por ejemplo: en java

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

   En Kotlin ( las interfaces funcionales no son compatibles antes de Kotlin 1.4, pero solo son compatibles después de 1.4 ): declarado mediante la palabra clave fun 

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

        Para evitar agregar otros métodos abstractos a la interfaz funcional declarada, puede usar la restricción de anotación @FunctionalInterface . Si agrega otros métodos abstractos a la interfaz cuadrada, el compilador informará un error.

        Las interfaces funcionales pueden implementar la conversión SAM mediante expresiones lambda, lo que hace que el código sea más conciso y legible. Las expresiones Lambda pueden reemplazar la creación manual de clases que implementan interfaces funcionales. Se requiere que el tipo de función de la expresión Lambda de Kotlin sea coherente con el tipo del método abstracto único de la interfaz funcional .

2. Método de construcción SAM

        El constructor SAM se puede utilizar para mostrar expresiones lambda que se convierten en instancias de interfaces funcionales (los tipos de funciones son consistentes). El compilador también puede convertirlo automáticamente .

        (1) Conversión de visualización mediante el método de construcción SAM

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

        (2) Conversión automática a través del compilador.

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

        Antes de Kotlin 1.4, cuando una función recibía múltiples interfaces funcionales, era necesario usar el método constructor SAM para convertir explícitamente o usar la conversión automática al mismo tiempo. (No hay límite de tiempo después de Kotlin 1.4)

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

      

1. Introducción al uso de expresiones Lambda en la API funcional de la colección.

2. Tipos de funciones y creación de instancias

3. Conversión SAM (Conversiones de método abstracto único)

4. Función en línea
en línea

Supongo que te gusta

Origin blog.csdn.net/old_land/article/details/119573415
Recomendado
Clasificación