Les fonctions d'ordre supérieur sont des fonctions qui prennent d'autres fonctions comme paramètres ou les retournent. Kotlin utilise des expressions lambda pour transmettre facilement des comportements comme des valeurs.
fun operateOnNumbers(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } val sum = operateOnNumbers(3, 2) { x, y -> x + y } // sum = 5
fun multiply(x: Int, y: Int) = x * y operateOnNumbers(2, 3, ::multiply)
fun makeMultiplier(factor: Int): (Int) -> Int = { x -> x * factor } val triple = makeMultiplier(3) val result = triple(10) // 30
it).Quelle est la différence entre la déclaration du type de fonction
(Int, Int) -> Intet l'utilisation du typeFunction2<Int, Int, Int>?
Réponse : La syntaxe (Int, Int) -> Int est simplement une déclaration "plus jolie" (sucre syntaxique) pour l'interface Function2<Int, Int, Int>. En pratique, les deux options sont totalement interchangeables.
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
Mais la première option est généralement préférable pour sa lisibilité.
Histoire
Dans un grand système de traitement d'événements, des dizaines d'expressions lambda ont été créées à l'intérieur d'une boucle sans utiliser de fonction inline. Cela a provoqué une forte charge sur le GC et une dégradation des performances, car un objet de fonction anonyme séparé était créé pour chaque appel.
Histoire
Lors de la tentative de retourner une fonction d'une autre fonction, la signature de la fonction de retour n'a pas été correctement spécifiée, ce qui a entraîné une erreur de compilation et une longue recherche de la cause. L'erreur était due à l'absence de parenthèses dans le type :
fun foo(): Int -> Intau lieu defun foo(): (Int) -> Intcorrecte.
Histoire
Un développeur a tenté d'utiliser une lambda sans type explicitement indiqué comme paramètre d'une autre fonction avec un type non déduit, ce qui a entraîné l'erreur "cannot infer a type for this parameter". Le problème a été résolu en indiquant explicitement le type de la lambda ou du paramètre de la fonction.