Lambda: ano ito, syntax at paggamit sa Kotlin

May-akda: IT Sectr Nai-publish: 2026-06-23 Oras ng pagbabasa: 7 min

Lambda — ay isang anonymous na function na ipinakita bilang isang compact na expression { mga argumento -> katawan }. Sa Kotlin, ang mga lambda ang pangunahing paraan upang magpasa ng pag-uugali sa mga higher-order function, na nagbibigay ng maikling syntax nang hindi kinakailangang magdeklara ng hiwalay na function. Ayon sa dokumentasyon ng Kotlin (2026), higit sa 70% ng mga higher-order function sa mga tipikal na proyekto ay tinatawag gamit ang mga lambda. Lambda ay nagpapahintulot sa pagsulat ng code sa functional na istilo na may minimal na syntactic noise.

Mga pangunahing punto

  • Lambda — anonymous na function sa syntax na { args -> body }, walang pangalan
  • Implicit na pangalang it pumapalit sa nag-iisang argumento ng lambda, pinapasimple ang pagsulat
  • Trailing lambda — paglalagay ng huling lambda sa labas ng panaklong ng tawag para sa madaling pagbasa
  • Pagkuha (closure) — maaaring ma-access ng lambda ang mga variable mula sa panlabas na saklaw
  • Functional na uri (T) -> R tumutukoy sa lagda ng lambda at sinusuri ng compiler

Ano ang lambda?

Lambda (lambda expression) — ay isang anonymous na function na tinukoy bilang isang expression, hindi isang deklarasyon. Ang termino ay nagmula sa lambda calculus ni Alonzo Church (1936). Sa programming, ang lambda ay kumakatawan sa isang bloke ng code na maaaring ipasa bilang halaga, iimbak sa isang variable, at tawagan sa ibang pagkakataon. Sa Kotlin, ang lambda ay palaging nakapaloob sa mga kulot na panaklong { }, ang mga argumento ay pinaghihiwalay mula sa katawan ng arrow ->.

Ang lambda ay naiiba sa isang ordinaryong function sa kawalan ng pangalan at keyword na fun. Ito ay nagpapahintulot sa pagdeklara ng pag-uugali nang direkta sa punto ng paggamit, nang hindi nadudumihan ang code ng mga karagdagang deklarasyon. Ang Kotlin compiler ay kumukuha ng mga uri ng argumento mula sa konteksto, kaya sa maraming kaso ang mga uri ay maaaring tanggalin. Ang lambda ay syntactic sugar sa ibabaw ng functional na uri (T) -> R: bawat lambda ay may katumbas na functional na uri.

Ang pangunahing gamit ng mga lambda sa Kotlin ay ang pagpasa sa mga higher-order function. Ang standard library ay gumagamit ng mga lambda kahit saan: filter { it > 0 }, map { it.uppercase() }, forEach { println(it) }. Ginagamit din ang mga lambda para sa paglikha ng mga event listener, callback, configurator ng bagay sa pamamagitan ng apply at run, na ginagawang mas deklaratibo ang code kumpara sa mga anonymous na klase.

Syntax ng mga lambda expression sa Kotlin

Ang kumpletong anyo ng lambda expression sa Kotlin: { mga argumento -> katawan_ng_lambda }. Ang mga argumento ay nakalista na may kuwit, sinusundan ng arrow at katawan — isa o higit pang mga expression. Kung ang katawan ay naglalaman ng maraming linya, ang huling expression ay magiging halaga ng pagbabalik. Kung ang function ay tumatanggap ng lambda bilang huling argumento, maaari itong ilagay sa labas ng mga panaklong ng tawag.

kotlin
val sum: (Int, Int) -> Int = { a, b -> a + b }

// Mga uri na nakuha mula sa konteksto
val sumShort = { a: Int, b: Int -> a + b }

// Tawag sa lambda
val result = sum(5, 3)  // 8
println(result)

Ang variable na sum ay idineklara na may tahasang functional na uri (Int, Int) -> Int at sinimulan ng lambda { a, b -> a + b }. Para sa sumShort, ang mga uri ay tinukoy sa loob ng lambda at ang uri ng variable ay na-extract. Ang parehong variant ay katumbas. Ang pagtawag sa lambda ay hindi naiiba sa pagtawag sa ordinaryong function — ginagamit ang syntax na sum(5, 3). Ang lambda na walang argumento ay isinusulat bilang { body }, na may isang argumento — { it -> it * 2 } o simpleng { it * 2 }.

Implicit na pangalang it at pagtanggal ng mga argumento

Kapag ang lambda ay tumatanggap ng eksaktong isang argumento, ang Kotlin ay nagbibigay ng implicit na pangalang it. Tinatanggal nito ang pangangailangang ideklara ang argumento sa kaliwang bahagi. Ang programmer ay nagsusulat lamang ng katawan ng lambda, gamit ang it upang ma-access ang nag-iisang parameter. Ang ganitong syntax ay lalong maginhawa sa mga chain ng pagproseso ng koleksyon, kung saan ang it ay tumutukoy sa kasalukuyang elemento.

kotlin
val numbers = listOf(1, 2, 3, 4, 5)

// Tahasang pangalan ng parameter
val squaredExplicit = numbers.map { n -> n * n }

// Implicit na it
val squared = numbers.map { it * it }

// Pagsala gamit ang it
val even = numbers.filter { it % 2 == 0 }

println(squared) // [1, 4, 9, 16, 25]

Sa halimbawang map { it * it } ginagamit ang it sa halip na deklarasyong n ->. Awtomatikong itinatalaga ng Kotlin ang it para sa nag-iisang parameter ng lambda. Kung ang lambda ay tumatanggap ng dalawa o higit pang mga argumento, ang it ay hindi nalikha — lahat ng parameter ay dapat na tahasang ideklara. Para sa mas mahusay na pagbasa ng mga nested na lambda, inirerekomenda na bigyan ang mga parameter ng makabuluhang pangalan at gamitin ang it sa maiikling isang-linya na predicate.

Trailing lambda at multi-line na lambda

Trailing lambda (pangwakas na lambda) — isang syntactic na feature ng Kotlin na nagpapahintulot na ilagay ang huling argumento-lambda sa labas ng mga bilog na panaklong ng tawag ng function. Ginagawa nitong katulad ang code sa mga built-in na construct ng wika. Kung ang lambda ay ang nag-iisang argumento, ang mga panaklong ay maaaring ganap na tanggalin. Ang pamamaraang ito ay aktibong ginagamit sa standard library at DSL.

kotlin
// Karaniwang tawag
thread(block = {
    println("Kamusta mula sa thread")
})

// Bersyong trailing lambda
thread {
    println("Kamusta mula sa thread")
}

// repeat na may trailing lambda
repeat(3) { index ->
    println("Iterasyon $index")
}

// run na may multi-line na lambda
val config = run {
    val host = "localhost"
    val port = 8080
    "$host:$port"
}

Ang function na thread ay tumatanggap ng Runnable bilang huling argumento. Dahil sa trailing lambda, ang lambda ay maaaring ipasa sa labas ng mga panaklong, na biswal na kahawig ng isang bloke ng code. Ang function na repeat ay tumatanggap ng bilang ng mga iteration at isang lambda na may index. run — isang halimbawa ng higher-order function kung saan ang multi-line na lambda ay kinakalkula ang halaga na ibinalik ng huling expression. Ang mga panaklong sa paligid ng run() ay maaaring tanggalin kung ang lambda ay ang nag-iisang argumento.

Pagkuha ng mga variable (closure) sa mga lambda

Pagkuha ng mga variable (closure) — kakayahan ng lambda na ma-access ang mga variable na idineklara sa panlabas na saklaw. Sa Kotlin, ang lambda ay maaaring magbasa at magbago ng mga var variable, pati na rin magbasa ng mga val variable mula sa nakapaligid na konteksto. Ang mga nakuhang variable ay iniimbak kasama ng lambda sa buong siklo ng buhay nito, na nagpapahintulot sa paglikha ng mga function na may estado.

kotlin
fun makeCounter(): () -> Int {
    var count = 0
    return {
        count++  // bilang ng mga nakuha
    }
}

fun main() {
    val counter = makeCounter()
    println(counter()) // 0
    println(counter()) // 1
    println(counter()) // 2
}

Ang function na makeCounter ay nagdedeklara ng lokal na variable na count at nagbabalik ng lambda { count++ }. Bagaman natapos na ng makeCounter ang trabaho nito, ang ibinalik na lambda ay nagpapanatili ng referensya sa count sa pamamagitan ng closure. Bawat tawag sa counter() ay nagdaragdag at nagbabalik ng kasalukuyang halaga. Ang mekanismong closure ay nasa pundasyon ng currying, mga pabrika ng function, at memoization. Mahalagang tandaan na ang pagkuha ng mga nababagong variable ay maaaring humantong sa hindi inaasahang pag-uugali sa parallel na pagpapatupad.

Mga madalas itanong

Maaari bang magkaroon ng return ang lambda?

Lambda ay hindi sumusuporta sa unconditional return — ang return na walang label ay nagbabalik ng kontrol sa panlabas na function. Para lumabas sa lambda, gamitin ang return@label, kung saan ang label ay ang pangalan ng higher-order function kung saan ipinasa ang lambda.

Ano ang pagkakaiba sa pagitan ng lambda at anonymous na function?

Anonymous na function ay isinusulat bilang fun(a: Int): Int { return a * 2 } at sumusuporta sa return na walang label. Lambda { a -> a * 2 } ay mas maikli sa syntax, ngunit nangangailangan ng return@label para sa maagang paglabas.

Paano magpasa ng lambda bilang argumento nang walang arrow?

Kung ang lambda ay hindi tumatanggap ng mga argumento, ang arrow ay tinatanggal: { body() }. Kung tumatanggap ng isang argumento at hindi ito ginagamit, sa halip na arrow ay isinusulat ang { _ -> body() } na may underscore para huwag pansinin ang parameter.

Lumilikha ba ang lambda ng bagong object palagi?

Oo, bawat lambda na ipinasa sa non-inline na function ay lumilikha ng instance ng anonymous na klase. Para sa mga inline na function, ang lambda ay ipinapasok sa lugar ng tawag nang hindi lumilikha ng object. Ang mga non-capturing na lambda ay naka-cache sa mga singleton object.

Bakit hindi maaaring gamitin ang return nang direkta sa lambda?

Return sa Kotlin ay isang jump operator na pag-aari ng pinakamalapit na function na may fun. Ang lambda ay hindi isang function (fun), kundi isang expression. Samakatuwid, ang return sa loob ng lambda na walang label ay itinuturing na pagbabalik mula sa panlabas na nakapaligid na function.

Buod

  • Lambda — anonymous na function sa syntax na { args -> body }, ipinapasa bilang halaga sa higher-order function
  • Implicit na pangalang it pumapalit sa nag-iisang argumento at ginagawang mas compact ang code sa maiikling predicate
  • Trailing lambda naglalagay ng huling lambda sa labas ng mga panaklong ng tawag para mabasa bilang bloke ng code
  • Pagkuha (closure) nagpapahintulot sa lambda na ma-access ang mga variable mula sa panlabas na konteksto pagkatapos matapos ang nakapaligid na function
  • Functional na uri (T) -> R tumutukoy sa lagda ng lambda na may pagsusuri sa yugto ng compilation
  • Inline na mga function tinatanggal ang paglikha ng mga anonymous na klase para sa mga lambda, pinapataas ang performance sa mga loop
  • Multi-line na lambda nagbabalik ng halaga ng huling expression, sumusuporta sa mga kumplikadong kalkulasyon nang hindi nagdedeklara ng hiwalay na function

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din