Funkcje wyższego rzędu to funkcje, które przyjmują inne funkcje jako parametry lub je zwracają. Kotlin używa wyrażeń lambda, aby wygodnie przekazywać zachowanie jako wartość.
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).Jaka jest różnica między deklaracją typu funkcji
(Int, Int) -> Inta używaniem typuFunction2<Int, Int, Int>?
Odpowiedź: Składnia (Int, Int) -> Int to po prostu bardziej "estetyczna" deklaracja (syntaktyczny cukier) dla interfejsu Function2<Int, Int, Int>. W praktyce oba warianty są całkowicie wymienne.
val f1: (Int, Int) -> Int = { x, y -> x + y } val f2: Function2<Int, Int, Int> = { x, y -> x + y }
Jednak pierwszy wariant jest zazwyczaj preferowany ze względu na czytelność.
Historia
W dużym systemie przetwarzania zdarzeń tworzono dziesiątki wyrażeń lambda w obrębie pętli bez użycia funkcji inline. Spowodowało to wysokie obciążenie GC i degradację wydajności, ponieważ dla każdego wywołania tworzony był oddzielny anonimowy obiekt funkcji.
Historia
Przy próbie zwrócenia funkcji z innej funkcji nieprawidłowo określono sygnaturę zwracanej funkcji, co doprowadziło do błędu kompilacji i długiego poszukiwania przyczyny. Błąd polegał na braku nawiasów w typie:
fun foo(): Int -> Intzamiast poprawnegofun foo(): (Int) -> Int.
Historia
Programista próbował użyć lambdy bez jawnie określonego typu jako parametru innej funkcji z niewydedukowanym typem, co doprowadziło do błędu "cannot infer a type for this parameter". Problem rozwiązano przez jawne określenie typu lambdy lub parametru funkcji.