Lambda ifodalari misollar bilan. Yuqori darajadagi funktsiyalar va lambdalar


Download 37.33 Kb.
bet11/17
Sana25.10.2023
Hajmi37.33 Kb.
#1720034
1   ...   7   8   9   10   11   12   13   14   ...   17
Bog'liq
Lambda ifodalari misollar bilan

Lambda iboralar sintaksisi
kabi lambda iboralarning to`liq sintaktik shakli funksiya turlarining literallari, quyidagicha ifodalanishi mumkin:
Val summasi = ( x: Int, y: Int -> x + y )
Lambda ifodasi har doim qavslar ichiga olinadi (...) , bu sintaksis bilan parametrlarni e'lon qilish bu qavslar ichida sodir bo'ladi va turdagi izohlarni o'z ichiga olishi mumkin (ixtiyoriy), funktsiya tanasi -> belgisidan keyin boshlanadi. Qaytish turi Unit bo'lmasa, lambda tanasi ichidagi oxirgi (va ehtimol yagona) ifoda qaytarish turi sifatida qabul qilinadi.
Agar biz barcha ixtiyoriy deklaratsiyalarni olib tashlasak, qolgan narsa quyidagicha ko'rinadi:
Val summasi: (Int, Int) -> Int = ( x, y -> x + y )
Lambda ifodasi faqat bitta parametrga ega bo'lishi odatiy holdir. Agar Kotlin metod imzosini o'zi belgilashi mumkin, u bizga ushbu yagona parametrni e'lon qilmaslikka imkon beradi va uni o'zi nomi ostida e'lon qiladi:
Ints.filter ( it > 0 ) //Bu konstanta "(it: Int) -> Mantiqiy" turiga ega.
Biz malakali qaytarish sintaksisi yordamida lambdadan qiymatni aniq qaytarishimiz mumkin:
ints.filter (val shouldFilter = it > 0 shouldFilter) ints.filter (val shouldFilter = it > 0 return@filter shouldFilter)
E'tibor bering, funktsiya o'zining oxirgi parametri sifatida boshqa funktsiyani oladi, keyin lambda ifodasi argumenti qavs ichidagi argumentlar ro'yxatidan tashqarida olinishi mumkin. CallSuffix ga qarang.
Anonim funktsiyalar
Lambda ifodasi sintaksisining hali aytib o'tilmagan yagona xususiyati - bu funktsiyaning qaytish turini aniqlash va tayinlash qobiliyati. Ko'pgina hollarda, bu ayniqsa kerak emas, chunki u avtomatik ravishda hisoblanishi mumkin. Ammo, agar siz qaytarish turini belgilashingiz kerak bo'lsa, siz alternativ sintaksisdan foydalanishingiz mumkin:
Fun(x: Int, y: Int): Int = x + y
Anonim funksiya deklaratsiyasi oddiy funktsiya deklaratsiyasiga juda o'xshaydi, faqat uning nomi o'tkazib yuborilgan. Bunday funktsiyaning tanasi ifoda (yuqorida ko'rsatilganidek) va blok bilan tavsiflanishi mumkin:
Fun(x: Int, y: Int): Int (qaytish x + y)
Funktsiya parametrlari va qaytish turi oddiy funktsiyalardagi kabi belgilanadi. To'g'ri, agar uning qiymati kontekstdan kelib chiqsa, parametr turini o'tkazib yuborish mumkin:
ints.filter(qiziq (element) = element > 0)
Xuddi shunday, qaytariladigan qiymat turi bilan: ifoda funktsiyalari uchun avtomatik ravishda hisoblanadi yoki bloklari mavjud bo'lgan anonim funktsiyalar uchun qo'lda aniqlanishi kerak (agar birlik turi bo'lmasa).
Esda tutingki, anonim funksiya parametrlari har doim qavslar (...) ichiga olinadi. Parametrlarni qavslar tashqarisida qoldirish texnikasi faqat lambda ifodalari bilan ishlaydi.
Lambda ifodalari va anonim funktsiyalar o'rtasidagi farqlardan biri bu qaytish bayonotining xatti-harakatidir (mahalliy bo'lmagan qaytarishlar). (@) belgisi bo'lmagan qaytish so'zi har doim fun kalit so'zi bilan e'lon qilingan funktsiyadan qaytadi. Bu shuni anglatadiki, lambda ifodasi ichidagi qaytish ushbu lambda ifodasini o'z ichiga olgan funktsiyaga bajarilishini qaytaradi. Anonim funksiyalar ichida return iborasi, o'z navbatida, anonim funksiyaning o'zidan chiqadi.
Yopishlar
Lambda ifodasi yoki anonim funksiya (xuddi mahalliy funktsiya yoki ob'ekt ifodasi kabi) uning yopilishiga, ya'ni ushbu ifoda yoki funksiyadan tashqarida e'lon qilingan o'zgaruvchilarga kirish huquqiga ega. Java-dan farqli o'laroq, yopishda olingan o'zgaruvchilar o'zgartirilishi mumkin:
Var sum = 0 ints.filtr ( it > 0 ).forEach ( sum += it ) print(sum)

Download 37.33 Kb.

Do'stlaringiz bilan baham:
1   ...   7   8   9   10   11   12   13   14   ...   17




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling