Lambda — је анонимна функција представљена у облику компактног израза { аргументи -> тело }. У Kotlin-у, ламбде су основни начин преношења понашања у функције вишег реда (higher-order functions), обезбеђујући концизну синтаксу без потребе за декларисањем посебне функције. Према документацији Kotlin-а (2026), више од 70% функција вишег реда у типичним пројектима се позива са ламбдама. Lambda омогућава писање кода у функционалном стилу са минималним синтаксним шумом.
Главне тачке
Lambda (ламбда израз) — је анонимна функција дефинисана као израз, а не декларација. Термин потиче од ламбда рачуна Алонза Черча (1936). У програмирању, ламбда представља блок кода који се може пренети као вредност, сачувати у променљивој и позвати касније. У Kotlin-у, ламбда је увек затворена у витичасте заграде { }, аргументи су одвојени од тела стрелицом ->.
Ламбда се разликује од обичне функције по одсуству имена и кључне речи fun. Ово омогућава декларисање понашања директно на месту употребе, без затрпавања кода додатним декларацијама. Компајлер Kotlin-а изводи типове аргумената из контекста, па се у многим случајевима типови могу изоставити. Ламбда је синтаксни шећер над функционалним типом (T) -> R: свака ламбда има одговарајући функционални тип.
Основна примена ламбди у Kotlin-у је преношење у функције вишег реда (higher-order functions). Стандардна библиотека користи ламбде свуда: filter { it > 0 }, map { it.uppercase() }, forEach { println(it) }. Ламбде се такође користе за креирање ослушкивача догађаја, повратних позива, конфигуратора објеката кроз apply и run, што чини код декларативнијим у поређењу са анонимним класама.
Потпуни облик ламбда израза у Kotlin-у: { аргументи -> тело_ламбде }. Аргументи се набрајају са зарезом, затим следи стрелица и тело — један или више израза. Ако тело садржи више редова, последњи израз постаје повратна вредност. Ако функција прихвата ламбду као последњи аргумент, она се може извући ван заграда позива.
val sum: (Int, Int) -> Int = { a, b -> a + b }
// Типови изведени из контекста
val sumShort = { a: Int, b: Int -> a + b }
// Позив ламбде
val result = sum(5, 3) // 8
println(result)
Променљива sum је декларисана са експлицитним функционалним типом (Int, Int) -> Int и иницијализована ламбдом { a, b -> a + b }. За sumShort типови су наведени унутар ламбде, а тип променљиве је изведен. Обе варијанте су еквивалентне. Позивање ламбде се не разликује од позивања обичне функције — користи се синтакса sum(5, 3). Ламбда без аргумената се пише као { body }, са једним аргументом — { it -> it * 2 } или једноставно { it * 2 }.
Када ламбда прихвата тачно један аргумент, Kotlin обезбеђује неимплицитно име it. Ово елиминише потребу за декларисањем аргумента са леве стране. Програмер пише само тело ламбде, користећи it за приступ једином параметру. Оваква синтакса је посебно згодна у ланцима обраде колекција, где it означава тренутни елемент.
val numbers = listOf(1, 2, 3, 4, 5)
// Експлицитно име параметра
val squaredExplicit = numbers.map { n -> n * n }
// Имплицитно it
val squared = numbers.map { it * it }
// Филтрирање са it
val even = numbers.filter { it % 2 == 0 }
println(squared) // [1, 4, 9, 16, 25]
У примеру map { it * it } користи се it уместо декларације n ->. Kotlin аутоматски додељује it за једини параметар ламбде. Ако ламбда прихвата два или више аргумената, it се не креира — потребно је експлицитно декларисати све параметре. Ради боље читљивости угњеждених ламбди, препоручује се давање смислених имена параметрима, а it користити у кратким једноредним предикатима.
Trailing lambda (завршна ламбда) — синтаксна карактеристика Kotlin-а која омогућава извлачење последњег аргумента-ламбде ван округлих заграда позива функције. Ово чини код сличним уграђеним језичким конструкцијама. Ако је ламбда једини аргумент, заграде се могу потпуно изоставити. Овај приступ се активно користи у стандардној библиотеци и DSL-у.
// Стандардни позив
thread(block = {
println("Здраво из нити")
})
// Верзија са trailing lambda
thread {
println("Здраво из нити")
}
// repeat са trailing lambda
repeat(3) { index ->
println("Итерација $index")
}
// run са вишелинијском ламбдом
val config = run {
val host = "localhost"
val port = 8080
"$host:$port"
}
Функција thread прихвата Runnable као последњи аргумент. Захваљујући trailing lambda, ламбда се може пренети ван заграда, што визуелно подсећа на блок кода. Функција repeat прихвата број итерација и ламбду са индексом. run — пример функције вишег реда где вишелинијска ламбда израчунава вредност коју враћа последњи израз. Заграде око run() се могу изоставити ако је ламбда једини аргумент.
Захватање променљивих (closure) — способност ламбде да приступи променљивим декларисаним у спољашњем опсегу видљивости. У Kotlin-у, ламбда може читати и мењати var променљиве, као и читати val променљиве из окружујућег контекста. Захваћене променљиве се чувају заједно са ламбдом током целог њеног животног циклуса, што омогућава креирање функција са стањем.
fun makeCounter(): () -> Int {
var count = 0
return {
count++ // број захватања
}
}
fun main() {
val counter = makeCounter()
println(counter()) // 0
println(counter()) // 1
println(counter()) // 2
}
Функција makeCounter декларише локалну променљиву count и враћа ламбду { count++ }. Иако је makeCounter завршила рад, враћена ламбда задржава референцу на count кроз затворење. Сваки позив counter() повећава и враћа тренутну вредност. Механизам closure лежи у основи карирања, фабрика функција и мемоизације. Важно је запамтити да захватање променљивих променљивих може довести до неочекиваног понашања при паралелном извршавању.
Често постављана питања
Ламбда не подржава безусловни return — return без ознаке враћа контролу спољашњој функцији. За излазак из ламбде користите return@label, где је label име функције вишег реда којој је ламбда прослеђена.
Анонимна функција се пише као fun(a: Int): Int { return a * 2 } и подржава return без ознаке. Ламбда { a -> a * 2 } је краћа синтаксно, али захтева return@label за рани излаз.
Ако ламбда не прихвата аргументе, стрелица се изоставља: { body() }. Ако прихвата један аргумент и не користи га, уместо стрелице се пише { _ -> body() } са доњом цртом за игнорисање параметра.
Да, свака ламбда прослеђена non-inline функцији креира инстанцу анонимне класе. За inline функције, ламбда се убацује на месту позива без креирања објекта. Non-capturing ламбде се кеширају у singleton објекте.
Return у Kotlin-у је оператор скока који припада најближој функцији са fun. Ламбда није функција (fun), већ израз. Стога се return унутар ламбде без ознаке сматра повратком из спољашње обухватајуће функције.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође