Consejo rápido escriba un código más limpio con las conversiones SAM de Kotlin

Si usted es un desarrollador de aplicaciones de Android con experiencia, probablemente esté acostumbrado a la verbosidad de Java 7. Como resultado, podría estar encontrando la sintaxis concisa de Kotlin, que está orientada hacia los programadores funcionales, algo inquietante.

Un problema común que encuentran los principiantes mientras aprenden Kotlin es entender cómo espera que trabaje con interfaces Java que contienen un solo método. Estas interfaces son ubicuas en el mundo Android y a menudo se las denomina interfaces SAM, donde SAM es la abreviatura de Single Abstract Method..

En este breve tutorial, aprenderá todo lo que necesita saber para usar adecuadamente las interfaces SAM de Java en el código Kotlin.

1. ¿Qué es una conversión SAM??

Cuando desee utilizar una interfaz Java que contenga un solo método en su código Kotlin, no tiene que crear manualmente una clase anónima que lo implemente. En su lugar, puede utilizar una expresión lambda. Gracias a un proceso llamado conversión SAM, Kotlin puede convertir de forma transparente cualquier expresión lambda cuya firma coincida con la del método único de la interfaz en una instancia de una clase anónima que implementa la interfaz..

Por ejemplo, considere la siguiente interfaz Java de un método:

Adder de la interfaz pública public void add (int a, int b); 

Un enfoque ingenuo y similar a Java 7 para usar la interfaz anterior implicaría trabajar con un objeto expresión y se vería así:

// Creando una instancia de una clase anónima // usando la palabra clave del objeto val sumador = objeto: Adder anular diversión agregar (a: Int, b: Int): Int return a + b

Eso es un montón de código innecesario, que tampoco es muy legible. Sin embargo, al aprovechar el recurso de conversión SAM de Kotlin, puede escribir el siguiente código equivalente en su lugar:

// Creando instancia usando un lambda val adder = Adder a, b -> a + b

Como puede ver, ahora hemos reemplazado la clase anónima con una expresión lambda corta, que tiene como prefijo el nombre de la interfaz. Tenga en cuenta que el número de argumentos que toma la expresión lambda es igual al número de parámetros en la firma del método de la interfaz.

2. Conversiones SAM en llamadas de función

Mientras trabaja con clases Java que tienen métodos que toman los tipos de SAM como sus argumentos, puede simplificar aún más la sintaxis anterior. Por ejemplo, considere la siguiente clase de Java, que contiene un método que espera que un objeto que implementa el Sumador interfaz:

calculadora de clase pública sumador de sumador privado; public void setAdder (Adder Adder) this.adder = adder;  public void add (int a, int b) Log.d ("CALCULATOR", "La suma es" + adder.add (a, b)); 

En su código Kotlin, ahora puede pasar directamente una expresión lambda a setAdder () Método, sin prefijarlo con el nombre del Sumador interfaz.

val calculator = Calculadora () calculator.setAdder (a, b -> a + b)

Vale la pena señalar que al llamar a un método que toma un tipo SAM como único argumento, puede omitir el paréntesis para hacer que su código sea aún más conciso..

calculator.setAdder a, b -> a + b

3. Conversiones SAM Sin Lambdas

Si crees que las expresiones lambda son confusas, tengo buenas noticias para ti: las conversiones de SAM también funcionan bien con las funciones comunes. Por ejemplo, considere la siguiente función cuya firma coincide con la de la Sumador método de la interfaz:

fun myCustomAdd (a: Int, b: Int): Int = if (a + b < 100) -1 else if (a+b < 200) 0 else a+b

Kotlin te permite pasar directamente el myCustomAdd () funcionar como un argumento a la setAdder () método de la Calculadora clase. No olvide hacer referencia al método usando el :: operador. Así es cómo:

calculator.setAdder (this :: myCustomAdd)

4. El eso Variable

Muchas veces, las interfaces SAM contienen métodos de un solo parámetro. Un método de un parámetro, como sugiere su nombre, tiene un solo parámetro en su firma. Mientras trabaja con tales interfaces, Kotlin le permite omitir el parámetro en la firma de su expresión lambda y usar una variable implícita llamada eso En el cuerpo de la expresión. Para aclarar las cosas, considere la siguiente interfaz de Java:

Interfaz pública Doubler public int doubleIt (número int); 

Mientras usa el Doubler interfaz en su código Kotlin, no tiene que mencionar explícitamente el número Parámetro en la firma de tu expresión lambda. En su lugar, simplemente puede referirse a él como eso.

// Esta expresión lambda que usa la variable it val doubler1 = Doubler 2 * it // es equivalente a esta expresión lambda común val doubler2 = Doubler number -> 2 * number

5. Interfaces SAM en Kotlin

Como desarrollador de Java, podría estar inclinado a crear interfaces SAM en Kotlin. Sin embargo, hacerlo no suele ser una buena idea. Si crea una interfaz SAM en Kotlin, o crea un método Kotlin que espera que un objeto implemente una interfaz SAM como un argumento, el recurso de conversión SAM no estará disponible para usted. La conversión SAM es una función de interoperabilidad de Java y está limitada a Java. solo clases e interfaces.

Como Kotlin admite funciones de funciones de orden superior que pueden tomar otras funciones como argumentos, nunca necesitará crear interfaces SAM en él. Por ejemplo, si el Calculadora La clase se reescribe en Kotlin, su setAdder () El método se puede escribir de manera que tome directamente una función como su argumento, en lugar de un objeto que implementa el Sumador interfaz.

clase Calculadora var adder: (a: Int, b: Int) -> Int = a, b -> 0 // Implementación predeterminada // Setter está disponible por defecto fun add (a: Int, b: Int)  Log.d ("CALCULATOR", "La suma es" + sumador (a, b))

Mientras utiliza la clase anterior, puede configurar sumador a una función o una expresión lambda utilizando la = operador. El siguiente código le muestra cómo:

val calculator = Calculator () calculator.adder = this :: myCustomAdd // OR calculator.adder = a, b -> a + b

Conclusión

Las API de Android están escritas en su mayoría en Java, y muchas utilizan las interfaces SAM de forma extensa. Lo mismo se puede decir de la mayoría de las bibliotecas de terceros también. Al utilizar las técnicas que aprendió en este tutorial, puede trabajar con ellas en su código Kotlin de manera concisa y fácil de leer.

Para obtener más información sobre las funciones de interoperabilidad de Kotlin en Java, consulte la documentación oficial. Y echa un vistazo a algunos de nuestros otros tutoriales sobre el desarrollo de aplicaciones para Android!