Si vous êtes un développeur d'applications Android expérimenté, vous êtes probablement habitué à la verbosité de Java 7. Par conséquent, vous trouverez peut-être la syntaxe concise de Kotlin, conçue pour les programmeurs fonctionnels, légèrement déroutante..
Un problème courant rencontré par les débutants lors de l'apprentissage de Kotlin consiste à comprendre comment il s'attend à ce que vous travailliez avec des interfaces Java contenant une seule méthode. De telles interfaces sont omniprésentes dans le monde Android et sont souvent appelées interfaces SAM. SAM est l'abréviation de Single Abstract Method..
Dans ce court tutoriel, vous apprendrez tout ce que vous devez savoir pour utiliser correctement les interfaces SAM de Java dans le code Kotlin..
Lorsque vous souhaitez utiliser une interface Java contenant une seule méthode dans votre code Kotlin, vous n'avez pas à créer manuellement une classe anonyme qui l'implémente. Au lieu de cela, vous pouvez utiliser une expression lambda. Grâce à un processus appelé conversion SAM, Kotlin peut convertir de manière transparente toute expression lambda dont la signature correspond à celle de la méthode unique de l'interface en une instance d'une classe anonyme implémentant l'interface..
Par exemple, considérons l'interface Java à une méthode suivante:
interface publique Adder public void add (int a, int b);
Une approche naïve et similaire à Java 7 pour utiliser l’interface ci-dessus impliquerait de travailler avec objet
expression et ressemblerait à ceci:
// Création d'une instance d'une classe anonyme // en utilisant le mot-clé object val adder = objet: Adder remplacement de l'amusement add (a: Int, b: Int): Int return a + b
C'est beaucoup de code inutile, qui n'est pas très lisible. En exploitant la fonction de conversion SAM de Kotlin, vous pouvez toutefois écrire le code équivalent suivant:
// Création d'une instance à l'aide d'un adder lambda val = Adder a, b -> a + b
Comme vous pouvez le constater, nous avons remplacé la classe anonyme par une expression lambda courte, préfixée par le nom de l'interface. Notez que le nombre d'arguments pris par l'expression lambda est égal au nombre de paramètres dans la signature de la méthode de l'interface..
Lorsque vous travaillez avec des classes Java dont les méthodes utilisent des types SAM, vous pouvez simplifier davantage la syntaxe ci-dessus. Par exemple, considérons la classe Java suivante, qui contient une méthode qui attend un objet implémentant le Additionneur
interface:
classe publique Calculator private additionder; public void setAdder (additionneur) this.adder = additionneur; public void add (int a, int b) Log.d ("CALCULATEUR", "La somme est" + adder.add (a, b));
Dans votre code Kotlin, vous pouvez maintenant passer directement une expression lambda au setAdder ()
méthode, sans la préfixer avec le nom du Additionneur
interface.
val calculator = Calculator () calculator.setAdder (a, b -> a + b)
Il est à noter que lorsque vous appelez une méthode qui utilise un type SAM comme seul argument, vous êtes libre de sauter la parenthèse pour rendre votre code encore plus concis..
calculator.setAdder a, b -> a + b
Si vous pensez que les expressions lambda sont source de confusion, j'ai une bonne nouvelle pour vous: les conversions SAM fonctionnent parfaitement avec les fonctions ordinaires. Par exemple, considérons la fonction suivante dont la signature correspond à celle de Additionneur
méthode de l'interface:
fun myCustomAdd (a: Int, b: Int): Int = if (a + b < 100) -1 else if (a+b < 200) 0 else a+b
Kotlin vous permet de passer directement le myCustomAdd ()
fonctionner comme un argument à la setAdder ()
méthode du Calculatrice
classe. N'oubliez pas de référencer la méthode en utilisant le ::
opérateur. Voici comment:
calculator.setAdder (this :: myCustomAdd)
il
VariablePlusieurs fois, les interfaces SAM contiennent des méthodes à un paramètre. Comme son nom l'indique, une méthode à un paramètre n'a qu'un seul paramètre dans sa signature. Tout en travaillant avec de telles interfaces, Kotlin vous permet d’omettre le paramètre dans la signature de votre expression lambda et d’utiliser une variable implicite appelée il
dans le corps de l'expression. Pour clarifier les choses, considérez l’interface Java suivante:
interface publique Doubler public int doubleIt (int number);
En utilisant le Doubleur
interface dans votre code Kotlin, vous ne devez pas mentionner explicitement le nombre
paramètre dans la signature de votre expression lambda. Au lieu de cela, vous pouvez simplement vous y référer comme il
.
// Cette expression lambda utilisant la variable it val doubler1 = Doubler 2 * it // est équivalente à cette expression lambda ordinaire val doubler2 = Doubleur nombre -> 2 * nombre
En tant que développeur Java, vous pourriez être enclin à créer des interfaces SAM dans Kotlin. Cela n’est cependant généralement pas une bonne idée. Si vous créez une interface SAM dans Kotlin ou créez une méthode Kotlin qui attend un objet implémentant une interface SAM en tant qu'argument, la fonction de conversion SAM ne sera pas disponible. La conversion SAM est une fonctionnalité d'interopérabilité Java et est limitée à Java. classes et interfaces seulement.
Parce que Kotlin prend en charge les fonctions d'ordre supérieur, des fonctions pouvant prendre d'autres fonctions en argument, vous n'aurez jamais besoin de créer d'interfaces SAM. Par exemple, si le Calculatrice
classe est réécrite à Kotlin, son setAdder ()
méthode peut être écrite de telle sorte qu’elle prend directement une fonction comme argument, au lieu d’un objet qui implémente le Additionneur
interface.
class Calculator var additionneur: (a: Int, b: Int) -> Int = a, b -> 0 // L'implémentation par défaut // Le Setter est disponible par défaut fun add (a: Int, b: Int) Log.d ("CALCULATEUR", "La somme est" + additionneur (a, b))
En utilisant la classe ci-dessus, vous pouvez définir additionneur
à une fonction ou une expression lambda en utilisant le =
opérateur. Le code suivant vous montre comment:
val calculator = Calculator () calculator.adder = this :: myCustomAdd // OR calculator.adder = a, b -> a + b
Les API d'Android sont en grande partie écrites en Java et bon nombre d'entre elles utilisent largement les interfaces SAM. On peut en dire autant de la plupart des bibliothèques tierces. En utilisant les techniques que vous avez apprises dans ce tutoriel, vous pouvez les utiliser dans votre code Kotlin de manière concise et facile à lire..
Pour en savoir plus sur les fonctionnalités d'interopérabilité Java de Kotlin, reportez-vous à la documentation officielle. Et consultez nos autres tutoriels sur le développement d'applications Android!