Kotlin Lambdas

Expressions lambda

L'expression Lambda ou simplement lambda est une fonction anonyme; une fonction sans nom. Ces fonctions sont passées immédiatement sous forme d'expression sans déclaration. Par exemple,

 fun main(args: Array) ( val greeting = ( println("Hello!")) // invoking function greeting() )

Lorsque vous exécutez le programme, la sortie sera:

 salut!

Ici, une expression lambda est affectée à la variable salutation. L'expression n'accepte aucun paramètre et ne renvoie aucune valeur dans ce programme.

Ensuite, la fonction (expression lambda) est appelée comme:

 salutation() 

Exemple: Lambda avec paramètres et type de retour

Le programme ci-dessous a une expression lambda qui accepte deux entiers comme paramètres et renvoie le produit de ces deux entiers.

 fun main(args: Array) ( val product = ( a: Int, b: Int -> a * b ) val result = product(9, 3) println(result) )

Lorsque vous exécutez le programme, la sortie sera:

 27

Ici, l'expression lambda est:

Remarquez qu'une expression lambda est placée entre accolades.

Fonction d'ordre supérieur

Koltin a un excellent support pour la programmation fonctionnelle. Vous pouvez passer des fonctions comme arguments à d'autres fonctions. En outre, vous pouvez renvoyer une fonction à partir d'autres fonctions. Ces fonctions sont appelées fonctions d'ordre supérieur.

Souvent, les expressions lambda sont transmises à une fonction d'ordre supérieur (plutôt qu'à une fonction typique) pour plus de commodité.

Exemple: passer Lambda à Function

Passons une expression lambda à une fonction d'ordre supérieur. Voici comment vous pouvez le faire.

 fun callMe(greeting: () -> Unit) ( greeting() ) fun main(args: Array) ( callMe(( println("Hello!") )) )

Lorsque vous exécutez le programme, la sortie sera:

 salut!

Voici callMe()une fonction d'ordre supérieur (car elle prend une fonction comme paramètre). Le paramètre de salutation accepte le lambda passé à la callMe()fonction comme:

 salutation: () -> Unité

Les parenthèses vides suggèrent que la fonction anonyme transmise n'accepte aucun paramètre. Et, le Unitmot - clé suggère que la fonction anonyme ne renvoie aucune valeur.

Les lambdas sont fréquemment utilisés lors de l'utilisation de collections. Et, il existe plusieurs fonctions intégrées disponibles dans la bibliothèque standard qui utilisent des lambdas pour faciliter notre tâche. Vous verrez quelques exemples ici:

Exemple: fonction maxBy ()

La fonction maxBy () renvoie le premier élément donnant la plus grande valeur de la fonction donnée ou nulls'il n'y a aucun élément.

 data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people.maxBy(( person -> person.age )) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )

Lorsque vous exécutez le programme, la sortie sera:

 Nom de la personne (nom = Jack, âge = 34): Jack âge: 34

Ici, maxBy()function prend une liste d'objets Person et retourne l'objet Person ayant l'âge maximum.

mot-clé: utilisé pour un paramètre unique

Dans le programme ci-dessus, l'expression lambda n'accepte qu'un seul paramètre (une liste d'objets Person). Dans de tels cas, vous pouvez faire référence à l'argument en utilisant le mot clé it.

Vous pouvez remplacer

 val selectedPerson = people.maxBy ((personne -> person.age))

avec

 val selectedPerson = people.maxBy ((it.age)) 

dans le programme ci-dessus.

Exemple: fonction maxBy () et startsWith ()

Le programme ci-dessous calcule l'âge maximum d'un objet Person en commençant par la lettre S.

Nous utiliserons deux fonctions de bibliothèque maxBy()et startsWith()pour accomplir cette tâche. La fonction starsWith () retourne truesi elle commence par le caractère spécifié passé en argument.

 data class Person(val name: String, val age: Int) fun main(args: Array) ( val people = listOf( Person("Jack", 34), Person("Shelly", 19), Person("Patrick", 13), Person("Jill", 12), Person("Shane", 22), Person("Joe", 18) ) val selectedPerson = people .filter ( it.name.startsWith("S") ) .maxBy( it.age ) println(selectedPerson) println("name: $(selectedPerson?.name)" ) println("age: $(selectedPerson?.age)" ) )

Lorsque vous exécutez le programme, la sortie sera:

 Nom de la personne (nom = Shane, âge = 22): Shane âge: 22

Lectures recommandées

  • Fermetures Kotlin
  • Kotlin avec et appliquer

Articles intéressants...