Lambda: یہ کیا ہے، نحو اور Kotlin میں استعمال

مصنف: IT Sectr اشاعت: 2026-06-23 مطالعے کا وقت: 7 منٹ

Lambda ایک گمنام فنکشن ہے جو ایک کمپیکٹ اظہار { آرگومنٹس -> باڈی } کے طور پر پیش کیا جاتا ہے۔ Kotlin میں، lambdas اعلیٰ ترتیب کے فنکشنز میں رویہ منتقل کرنے کا بنیادی طریقہ ہے، جو علیحدہ فنکشن اعلان کیے بغیر مختصر نحو فراہم کرتا ہے۔ Kotlin دستاویزات (2026) کے مطابق، عام پروجیکٹس میں 70% سے زیادہ اعلیٰ ترتیب کے فنکشنز lambdas کے ساتھ بلائے جاتے ہیں۔ Lambda کم سے کم نحوی شور کے ساتھ فعالی طرز میں کوڈ لکھنے کے قابل بناتا ہے۔

اہم نکات

  • Lambda — { args -> body } نحو میں ایک گمنام فنکشن، جس کا کوئی نام نہیں
  • مضمر it lambda کے واحد آرگومنٹ کو بدلتا ہے، تحریر کو آسان بناتا ہے
  • Trailing lambda — پڑھنے کی آسانی کے لیے آخری lambda کو کال قوسین کے باہر نکالنا
  • بندش (closure) — lambda بیرونی دائرہ کار کے متغیرات تک رسائی حاصل کر سکتا ہے
  • فعالی قسم (T) -> R lambda کے دستخط کی وضاحت کرتی ہے اور مرتب کنندہ کے ذریعے جانچی جاتی ہے

Lambda کیا ہے؟

Lambda (lambda اظہار) ایک گمنام فنکشن ہے جو اعلان کے بجائے ایک اظہار کے طور پر بیان کیا جاتا ہے۔ یہ اصطلاح ایلونزو چرچ کے lambda حساب (1936) سے ماخوذ ہے۔ پروگرامنگ میں، lambda کوڈ کا ایک بلاک ہے جسے قدر کے طور پر منتقل کیا جا سکتا ہے، متغیر میں محفوظ کیا جا سکتا ہے اور بعد میں بلایا جا سکتا ہے۔ Kotlin میں، lambda ہمیشہ گھنگریالے قوسین { } میں گھرا ہوتا ہے، جس میں آرگومنٹس -> تیر کے ذریعے باڈی سے الگ کیے جاتے ہیں۔

Lambda ایک عام فنکشن سے نام اور fun کلیدی لفظ کی عدم موجودگی میں مختلف ہوتا ہے۔ یہ اضافی اعلانات کے ساتھ کوڈ کو بے ترتیب کیے بغیر استعمال کے مقام پر براہ راست رویہ اعلان کرنے کی اجازت دیتا ہے۔ Kotlin مرتب کنندہ سیاق و سباق سے آرگومنٹ کی اقسام کا اندازہ لگاتا ہے، لہٰذا بہت سے معاملات میں اقسام کو چھوڑا جا سکتا ہے۔ Lambda فعالی قسم (T) -> R پر نحوی شوگر ہے: ہر lambda کی ایک مطابقت پذیر فعالی قسم ہوتی ہے۔

Kotlin میں lambdas کا بنیادی استعمال انہیں اعلیٰ ترتیب کے فنکشنز میں منتقل کرنا ہے۔ معیاری لائبریری ہر جگہ lambdas استعمال کرتی ہے: filter { it > 0 }، map { it.uppercase() }، forEach { println(it) }۔ Lambdas ایونٹ سننے والوں، کال بیکس اور apply اور run کے ذریعے آبجیکٹ کنفیگریٹرز کے لیے بھی استعمال ہوتے ہیں، جو گمنام کلاسز کے مقابلے میں کوڈ کو زیادہ اعلانیہ بناتے ہیں۔

Kotlin میں lambda اظہارات کا نحو

Kotlin میں lambda اظہار کی مکمل شکل: { آرگومنٹس -> lambda_باڈی }۔ آرگومنٹس کو کوما سے الگ کرکے درج کیا جاتا ہے، اس کے بعد ایک تیر اور باڈی — ایک یا زیادہ اظہارات۔ اگر باڈی میں کئی سطور ہوں تو آخری اظہار واپسی کی قدر بن جاتا ہے۔ اگر کوئی فنکشن lambda کو آخری آرگومنٹ کے طور پر لیتا ہے، تو اسے کال قوسین کے باہر منتقل کیا جا سکتا ہے۔

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

// سیاق و سباق سے اندازہ کردہ اقسام
val sumShort = { a: Int, b: Int -> a + b }

// Lambda کال
val result = sum(5, 3)  // 8
println(result)

متغیر sum ایک واضح فعالی قسم (Int, Int) -> Int کے ساتھ اعلان کیا گیا ہے اور ایک lambda { a, b -> a + b } سے شروع کیا گیا ہے۔ sumShort کے لیے، اقسام lambda کے اندر متعین ہیں اور متغیر کی قسم کا اندازہ لگایا گیا ہے۔ دونوں شکلیں مساوی ہیں۔ lambda کو بلانا ایک عام فنکشن کو بلانے سے مختلف نہیں — sum(5, 3) نحو استعمال کرتے ہوئے۔ بغیر آرگومنٹ کے lambda کو { body } لکھا جاتا ہے، ایک آرگومنٹ کے ساتھ — { it -> it * 2 } یا صرف { it * 2 }۔

مضمر it اور آرگومنٹس کا ترک کرنا

جب lambda بالکل ایک آرگومنٹ لیتا ہے، Kotlin مضمر نام it فراہم کرتا ہے۔ یہ بائیں جانب آرگومنٹ اعلان کرنے کی ضرورت کو ختم کرتا ہے۔ ڈویلپر صرف lambda باڈی لکھتا ہے، واحد پیرامیٹر تک رسائی کے لیے it استعمال کرتا ہے۔ یہ نحو خاص طور پر کلیکشن پروسیسنگ چینز میں آسان ہے، جہاں it موجودہ عنصر کی طرف اشارہ کرتا ہے۔

kotlin
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 } n -> اعلان کرنے کے بجائے it استعمال کرتا ہے۔ Kotlin خود بخود ایک lambda پیرامیٹر کے لیے it تفویض کرتا ہے۔ اگر lambda دو یا زیادہ آرگومنٹ لیتا ہے، it نہیں بنایا جاتا — تمام پیرامیٹرز کو واضح طور پر اعلان کرنا ضروری ہے۔ نیسٹڈ lambdas کی بہتر پڑھنے کی اہلیت کے لیے، پیرامیٹرز کو معنی خیز نام دینا اور it کو صرف مختصر ایک سطری پیش گوئوں میں استعمال کرنا مناسب ہے۔

Trailing lambda اور کثیر السطور lambdas

Trailing lambda Kotlin کی ایک نحوی خصوصیت ہے جو آخری lambda آرگومنٹ کو فنکشن کال قوسین کے باہر منتقل کرنے کی اجازت دیتی ہے۔ یہ کوڈ کو بلٹ ان لینگویج کنسٹرکٹس سے مشابہ بناتا ہے۔ اگر lambda واحد آرگومنٹ ہے، قوسین کو مکمل طور پر چھوڑا جا سکتا ہے۔ یہ نقطہ نظر معیاری لائبریری اور DSLs میں فعال طور پر استعمال ہوتا ہے۔

kotlin
// معیاری کال
thread(block = {
    println("تھریڈ سے ہیلو")
})

// Trailing lambda ورژن
thread {
    println("تھریڈ سے ہیلو")
}

// trailing lambda کے ساتھ دہرائیں
repeat(3) { index ->
    println("تکرار $index")
}

// کثیر السطور lambda کے ساتھ چلائیں
val config = run {
    val host = "localhost"
    val port = 8080
    "$host:$port"
}

thread فنکشن آخری آرگومنٹ کے طور پر Runnable قبول کرتا ہے۔ trailing lambda کی بدولت، lambda کو قوسین کے باہر منتقل کیا جا سکتا ہے، جو بصری طور پر کوڈ بلاک جیسا لگتا ہے۔ repeat فنکشن تکرار کی تعداد اور ایک انڈیکس کے ساتھ lambda لیتا ہے۔ run ایک اعلیٰ ترتیب کے فنکشن کی مثال ہے جہاں کثیر السطور lambda آخری اظہار کے ذریعے واپس کردہ قدر کا حساب لگاتا ہے۔ run() کے ارد گرد کے قوسین کو چھوڑا جا سکتا ہے اگر lambda واحد آرگومنٹ ہو۔

lambdas میں متغیر کی گرفت (closure)

متغیر کی گرفت (closure) lambda کی بیرونی دائرہ کار میں اعلان کردہ متغیرات تک رسائی حاصل کرنے کی صلاحیت ہے۔ Kotlin میں، lambda var متغیرات کو پڑھ اور تبدیل کر سکتا ہے، نیز ارد گرد کے سیاق و سباق سے val متغیرات پڑھ سکتا ہے۔ گرفت کیے گئے متغیرات اپنی پوری زندگی کے دوران lambda کے ساتھ محفوظ رہتے ہیں، جو حالت والے فنکشنز بنانے کے قابل بناتے ہیں۔

kotlin
fun makeCounter(): () -> Int {
    var count = 0
    return {
        count++  // گرفت کی تعداد
    }
}

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

makeCounter فنکشن ایک مقامی متغیر count کا اعلان کرتا ہے اور ایک lambda { count++ } واپس کرتا ہے۔ اگرچہ makeCounter نے عملدرآمد مکمل کر لیا ہے، واپس کیا گیا lambda بندش کے ذریعے count کا حوالہ برقرار رکھتا ہے۔ counter() کی ہر کال موجودہ قدر میں اضافہ کرتی ہے اور اسے واپس کرتی ہے۔ بندش کا طریقہ کار کریئنگ، فنکشن فیکٹریز اور میموائزیشن کی بنیاد ہے۔ یہ یاد رکھنا ضروری ہے کہ قابل تبدیلی متغیرات کو پکڑنا متوازی عملدرآمد میں غیر متوقع رویے کا سبب بن سکتا ہے۔

اکثر پوچھے گئے سوالات

کیا lambda میں return ہو سکتا ہے؟

Lambda غیر مشروط return کی حمایت نہیں کرتا — لیبل کے بغیر return بیرونی فنکشن کو کنٹرول واپس کرتا ہے۔ lambda سے باہر نکلنے کے لیے، return@label استعمال کریں، جہاں label اعلیٰ ترتیب کے فنکشن کا نام ہے جس میں lambda منتقل کیا گیا تھا۔

lambda اور گمنام فنکشن میں کیا فرق ہے؟

گمنام فنکشن fun(a: Int): Int { return a * 2 } کے طور پر لکھا جاتا ہے اور لیبل کے بغیر return کی حمایت کرتا ہے۔ lambda { a -> a * 2 } نحو میں چھوٹا ہے لیکن جلد اخراج کے لیے return@label کی ضرورت ہوتی ہے۔

تیر کے بغیر lambda کو آرگومنٹ کے طور پر کیسے منتقل کریں؟

اگر lambda کوئی آرگومنٹ نہیں لیتا، تیر چھوڑ دیا جاتا ہے: { body() }۔ اگر یہ ایک آرگومنٹ لیتا ہے اور اسے استعمال نہیں کرتا، تو پیرامیٹر کو نظر انداز کرنے کے لیے زیر خاک کے ساتھ { _ -> body() } لکھیں۔

کیا lambda ہمیشہ ایک نیا آبجیکٹ بناتا ہے؟

ہاں، ہر lambda جو غیر inline فنکشن میں منتقل کیا جاتا ہے، ایک گمنام کلاس کا نمونہ بناتا ہے۔ inline فنکشنز کے لیے، lambda آبجیکٹ بنائے بغیر کال سائٹ پر inline ہو جاتا ہے۔ غیر گرفت کرنے والے lambdas کو سنگلٹن آبجیکٹس میں کیش کیا جاتا ہے۔

lambda میں براہ راست return کیوں استعمال نہیں کیا جا سکتا؟

Kotlin میں Return ایک جمپ آپریٹر ہے جو fun کے ساتھ اعلان کردہ قریب ترین فنکشن سے تعلق رکھتا ہے۔ Lambda کوئی فنکشن (fun) نہیں، بلکہ ایک اظہار ہے۔ لہٰذا، لیبل کے بغیر lambda کے اندر return کو بیرونی محیط فنکشن سے واپسی کے طور پر سمجھا جاتا ہے۔

خلاصہ

  • Lambda — { args -> body } نحو میں گمنام فنکشن، اعلیٰ ترتیب کے فنکشنز میں قدر کے طور پر منتقل کیا جاتا ہے
  • مضمر it واحد آرگومنٹ کو بدلتا ہے، مختصر پیش گوئوں میں کوڈ کو زیادہ کمپیکٹ بناتا ہے
  • Trailing lambda آخری lambda کو کال قوسین کے باہر لے جاتا ہے، کوڈ بلاک کی طرح پڑھا جاتا ہے
  • بندش (closure) lambda کو محیط فنکشن کے مکمل ہونے کے بعد بیرونی سیاق و سباق کے متغیرات تک رسائی کی اجازت دیتی ہے
  • فعالی قسم (T) -> R مرتب وقت کی جانچ کے ساتھ lambda کے دستخط کی وضاحت کرتی ہے
  • Inline فنکشنز lambdas کے لیے گمنام کلاس کی تخلیق کو ختم کرتے ہیں، لوپس میں کارکردگی بہتر کرتے ہیں
  • کثیر السطور lambdas آخری اظہار کی قدر واپس کرتے ہیں، علیحدہ فنکشن اعلان کیے بغیر پیچیدہ حسابات کی حمایت کرتے ہیں

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں