Lambda ifodalari misollar bilan. Yuqori darajadagi funktsiyalar va lambdalar


Ro'yxat №1 (lambda funktsiyalari qatorlari ajratilgan)


Download 37.33 Kb.
bet2/17
Sana25.10.2023
Hajmi37.33 Kb.
#1720034
1   2   3   4   5   6   7   8   9   ...   17
Bog'liq
Lambda ifodalari misollar bilan

Ro'yxat №1 (lambda funktsiyalari qatorlari ajratilgan):
raqam = $raqam; ) umumiy funksiya getNumber() ($this->raqamni qaytaring; ) ) $aNumber = array(); uchun($i = 0; $i< 10; $i++) { $oNumber = new naturalNumber(); $oNumber->setNumber(rand(1, 10)); $aNumber = $onNumber; ) echo "Saralashdan oldin:
"; print_r($aNumber); echo "
"; usort($aNumber, function($oFirst, $oSecond) ( if($oFirst->getNumber()< $oSecond->getNumber()) ( return -1; ) $result = ($oFirst->getNumber() == $oSecond->getNumber()) ? 0:1; $natijani qaytarish; ))) echo "Saralashdan keyin:
"; print_r($aNumber); echo "
"; ?>
Ushbu misol $aNumber massivini naturalNumber sinfiga asoslangan ob'ektlar bilan to'ldiradi. Har bir obyekt tasodifiy sonni saqlaydi, unga getNumber() va setNumber() funksiyalari orqali kirish mumkin. Keyin massiv lambda funksiyasi yordamida tartiblanadi. usort() ikkinchi parametr ikki argumentli funksiya boʻlishini talab qiladi, ularning har biri tartiblangan massiv elementlariga turi boʻyicha mos kelishi kerak. Massiv to'ldirilgandan so'ng va dastur oxirida massiv chiqariladi.
Yopishlar

  • Funktsiya kontekstidan foydalaning

Yopishlar ham o'ziga xos tarzda "mazali", ularning "ta'mi" ning soyalarini har doim ham sezib bo'lmaydi. Ularning kodda ishlatilishi uslubi JavaScript-ga o'xshaydi. Yopishlar, ular aniqlangan kontekstning o'zgaruvchilaridan foydalanishidan tashqari, yana bir ajoyib xususiyatga ega - ularning ishlash muddati ular aniqlangan funktsiyadan uzoqroq bo'lishi mumkin.
O'zgaruvchilar qiymatlarini olish misoli uchun massivning yig'indisini olaylik va natijani dastur kontekstiga qaytaramiz. Aniqroq qilib aytadigan bo'lsak, yig'indisi sodir bo'ladigan o'zgaruvchiga havola olinadi. To'liq baxt uchun biz xulosa qilamiz rekursiv massiv bo'yicha :), keling, uning barcha burchaklariga tashrif buyuramiz. Misol dasturda ko'rsatilgan Ro'yxat №2:
Ro'yxat №2 (yopilish qatorlari ajratilgan):
"; ?>
Ushbu misolda qator ko'p o'lchovli massivdan uning barcha elementlarini bo'sh joy bilan ajratib yopishtirish orqali yaratilgan. Yelimlash uchun standart implode() funksiyasidan foydalaniladi, lekin bu yerda bunday emas – u ko‘p o‘lchovli massivlarni yopishtirmaydi. Ehtimol, kimdir uchun bu misol foydali bo'ladi.
Usulda yopilishdan foydalanganda e'tiborga olinishi kerak bo'lgan o'ziga xos xususiyat mavjud (usul - bu funktsiya, sinf a'zosi). Ma'lum bo'lishicha, u (yopish) $ bu ichki o'zgaruvchini (joriy misol uchun mas'ul) ushlamaydi. Uni hali ham yopilishga o'tkazish uchun siz mahalliy o'zgaruvchidan foydalanishingiz kerak, masalan, bu kabi $self = $this , so'ngra use($self) ni yopishga o'tkazishingiz kerak.
Ushbu funktsiyalardan foydalanishning ko'plab usullari mavjud. Misol uchun, siz JavaScript uslubidagi loyihalarni yaratishingiz mumkin, siz parametrlar va o'zgaruvchilarning ishlash muddatini uzaytirishingiz mumkin va boshqalar. Umid qilamizki, PHP 6 da bu mexanizm boshqa tillardagiga o'xshash bo'ladi.
Savollaringiz bormi? Izohlarga xush kelibsiz.



JDK 8 ning chiqarilishi bilan Java tiliga kiritilgan innovatsiyalar orasida lambda ifodalari ajralib turadi. Lambda bitta o'zgaruvchiga bo'linib, dasturning turli joylarida bir necha marta chaqirilishi mumkin bo'lgan ko'rsatmalar to'plamini ifodalaydi.
Lambda ifodasining asosi lambda operatori bo'lib, -> o'qni ifodalaydi. Ushbu operator lambda ifodasini ikki qismga ajratadi: chap qism ifoda parametrlari ro'yxatini o'z ichiga oladi va o'ng qism aslida lambda ifodasining tanasini ifodalaydi, bu erda barcha amallar bajariladi.
Lambda ifodasi o'z-o'zidan bajarilmaydi, lekin belgilangan usulning amalga oshirilishini tashkil qiladi funktsional interfeys. Shu bilan birga, bu muhim funktsional interfeys Amalga oshirishsiz faqat bitta usulni o'z ichiga olishi kerak.
Bir misolni ko'rib chiqing:
Ommaviy sinf LambdaApp ( public static void main(String args) ( Operatsion operatsiya; operatsiya = (x,y)->x+y; int result = operation.calculate(10, 20); System.out.println(natija); //30 ) ) interfeysi Operatsion ( int account(int x, int y); )
Funktsional interfeys Operatsion interfeys bo'lib, u amalga oshirilmasdan bitta usulni belgilaydi - hisoblash usuli. Bu usul ikkita parametr - butun sonlarni oladi va ba'zi bir butun sonni qaytaradi.
Aslida, lambda iboralari avval Java-da qo'llanilgan ichki anonim sinflar uchun ma'lum darajada qisqartma hisoblanadi. Xususan, oldingi misolni quyidagicha qayta yozishimiz mumkin:
Ommaviy klass LambdaApp ( public static void main(String args) ( Operatsionable op = new Operationable()( public int account(int x, int y)( return x + y; ) ); int z = op.calculate(20, 10) ); System.out.println(z); // 30 ) ) interfeysi Operatsion (int account(int x, int y); )
Lambda ifodasini e'lon qilish va ishlatish uchun asosiy dastur bir qator bosqichlarga bo'linadi:
operativ operatsiya;
Lambda ifodasini yaratish:
Amaliyot = (x,y)->x+y;
Bundan tashqari, lambda ifodasining parametrlari Operatsion interfeysning yagona usuli parametrlariga mos keladi va natija interfeys usulining qaytish natijasiga mos keladi. Bunday holda, lambda ifodasidan natijani qaytarish uchun biz qaytish kalit so'zidan foydalanishimiz shart emas.
Shunday qilib, interfeys usulida ikkala parametr ham int turini ifodalaydi, ya'ni lambda ifodasi tanasida biz ularga qo'shimchani qo'llashimiz mumkin. Qo'shish natijasi, shuningdek, int turini ifodalaydi, uning ob'ekti interfeys usuli bilan qaytariladi.
Lambda ifodasini interfeys usuliga chaqiruv sifatida ishlatish:
int natija = operatsiya.hisoblash(10, 20);
Parametrlarni qo'shish operatsiyasi lambda ifodasida aniqlanganligi sababli, usulning natijasi 10 va 20 raqamlarining yig'indisi bo'ladi.
Shu bilan birga, bitta funktsional interfeys uchun biz ko'plab lambda ifodalarini belgilashimiz mumkin. Masalan:
Operatsion operatsiya1 = (int x, int y)-> x + y; Operatsion operatsiya2 = (int x, int y)-> x - y; Operatsion operatsiya3 = (int x, int y)-> x * y; System.out.println(operation1.hisoblash(20, 10)); //30 System.out.println(operation2.hisoblash(20, 10)); //10 System.out.println(operation3.hisoblash(20, 10)); //200

Download 37.33 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   17




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