English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Expression lambda Kotlin

Expression lambda

Une expression lambda ou lambda pour courte, est une fonction anonyme ; une fonction sans nom. Ces fonctions sont transmises immédiatement en tant qu'expressions sans nécessiter de déclaration. Par exemple,

fun main(args: Array<String>) {
    val greeting = { println("Hello!")}
    //Appel de la fonction
    greeting()
}

Le résultat de l'exécution du programme est :

Hello!

Ici, l'expression lambda est assignée à la variable greeting. Cette expression ne prend aucun paramètre et ne retourne aucune valeur dans ce programme.

Ensuite, appeler la fonction (expression lambda) de la manière suivante :

greeting()

Exemple : Lambda avec paramètres et type de retour

Le programme suivant possède une expression lambda qui accepte deux entiers en tant que paramètres et retourne le produit de ces deux entiers.

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

Le résultat de l'exécution du programme est :

27

Ici, l'expression lambda est :

Veuillez noter que les accolades contiennent une expression lambda.

Fonctions de haute ordre

Koltin offre un soutien puissant pour la programmation fonctionnelle. Vous pouvez transmettre une fonction en tant que paramètre à d'autres fonctions. De plus, vous pouvez retourner une fonction à partir d'autres fonctions. Ces fonctionnalités sont appelées fonctions de haute ordre.

Pour des raisons pratiques, les expressions lambda sont généralement transmises aux fonctions de haute ordre (plutôt qu'aux fonctions typiques).

Exemple : Transmettre une Lambda à une fonction

Nous allons transmettre des expressions lambda aux fonctions de haute ordre. Voici votre méthode d'opération.

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

Le résultat de l'exécution du programme est :

Hello!

Dans ce cas, callMe() est une fonction de haut niveau (car elle prend une fonction en tant que paramètre). Le paramètre greeting accepte une Lambda passée à la fonction callMe() :

 greeting: () -> Unit

Des parenthèses vides indiquent que la fonction anonyme transmise ne prend aucun paramètre. Et le mot-clé Unit indique que la fonction anonyme ne retourne aucune valeur.

Les lambdas sont souvent utilisées pour traiter des ensembles. Et la bibliothèque standard contient plusieurs fonctions intégrées qui peuvent utiliser des lambdas pour simplifier notre manière de faire des tâches. Vous verrez ici quelques exemples :

Exemple : fonction maxBy()

La fonction maxBy() retourne le premier élément qui produit la valeur maximale de la fonction donnée ; si aucun élément n'existe, elle retourne null.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    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}" )
}

Le résultat de l'exécution du programme est :

Person(name=Jack, age=34)
name: "Jack"
age: 34

Dans ce cas, la fonction maxBy() prend une liste d'objets Personne et retourne l'objet Personne avec l'âge maximal.

Mot-clé it : utilisé pour un seul paramètre

Dans le programme ci-dessus, l'expression lambda accepte un seul paramètre (une liste d'objets Personne). Dans ce cas, vous pouvez utiliser le mot-clé it pour faire référence au paramètre.

Vous pouvez

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

Équivalent à

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

Dans le programme ci-dessus.

Exemple : fonctions maxBy() et startsWith()

Le programme suivant calcule l'âge maximal de la Personne whose name starts with the letter S.

Nous utiliserons les deux fonctions de bibliothèque maxBy() et startsWith() pour effectuer cette tâche. Si la fonction startsWith() commence par le caractère spécifié en tant que paramètre, elle renvoie true.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    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}" )
}

Le résultat de l'exécution du programme est :

Person(name=Shane, age=22)
name: Shane
age: 22