Hogere-ordefuncties zijn functies die andere functies als parameters accepteren of deze retourneren. Kotlin gebruikt lambda-expressies om gedrag eenvoudig als waarde door te geven.
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).Wat is het verschil tussen de functie-aanduiding
(Int, Int) -> Inten het gebruik van het typeFunction2<Int, Int, Int>?
Antwoord: De syntaxis (Int, Int) -> Int is gewoon een "mooie" aanduiding (syntactische suiker) voor het Function2<Int, Int, Int>-interface. In de praktijk zijn beide varianten volledig uitwisselbaar.
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
Maar de eerste variant is meestal te verkiezen vanwege de leesbaarheid.
Verhaal
In een grootschalig evenementenverwerkingssysteem werden tientallen lambda-expressies binnen een lus gemaakt zonder het gebruik van inline-functies. Dit veroorzaakte een hoge belasting voor de GC en een verslechtering van de prestaties, omdat voor elke aanroep een afzonderlijk anoniem functie-object werd gemaakt.
Verhaal
Bij het proberen terug te keren uit een andere functie was de handtekening van de geretourneerde functie niet correct opgegeven, wat leidde tot een compilatiefout en een lange zoektocht naar de oorzaak. De fout was dat er geen haakjes in het type stonden:
fun foo(): Int -> Intin plaats van het juistefun foo(): (Int) -> Int.
Verhaal
Een ontwikkelaar probeerde een lambda zonder expliciete type-aanduiding te gebruiken als parameter voor een andere functie met een niet-expliciet afgeleid type, wat leidde tot de fout "cannot infer a type for this parameter". Het probleem werd opgelost door expliciet het type van de lambda of parameters van de functie op te geven.