Funzioni di ordine superiore — sono funzioni che accettano altre funzioni come parametri o le restituiscono. Kotlin utilizza espressioni lambda per passare comportamenti come valori in modo conveniente.
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).Qual è la differenza tra la dichiarazione del tipo di funzione
(Int, Int) -> Inte l'uso del tipoFunction2<Int, Int, Int>?
Risposta: La sintassi (Int, Int) -> Int è semplicemente una dichiarazione "più bella" (sintassi zuccherosa) per l'interfaccia Function2<Int, Int, Int>. Nella pratica, entrambe le opzioni sono completamente intercambiabili.
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
Tuttavia, la prima opzione è solitamente preferibile per la leggibilità.
Storia
In un grande sistema di elaborazione eventi, sono state create decine di espressioni lambda all'interno di un ciclo senza utilizzare funzioni inline. Ciò ha causato un alto carico sul GC e una degradazione delle prestazioni, poiché per ogni invocazione veniva creato un oggetto anonimo di funzione separato.
Storia
Nel tentativo di restituire una funzione da un'altra funzione, la firma della funzione restituita non è stata specificata correttamente, portando a un errore di compilazione e a una lunga ricerca della causa. L'errore era nella mancanza di parentesi nel tipo:
fun foo(): Int -> Intinvece del correttofun foo(): (Int) -> Int.
Storia
Uno sviluppatore ha tentato di utilizzare una lambda senza un tipo esplicitamente specificato come parametro di un'altra funzione con un tipo non dedotto esplicitamente, il che ha portato all'errore "cannot infer a type for this parameter". Il problema è stato risolto specificando esplicitamente il tipo della lambda o del parametro della funzione.