Lambda ifodalari misollar bilan. Yuqori darajadagi funktsiyalar va lambdalar


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

java.lang.Runnable funksional interfeysga misol bo‘la oladi. U faqat bitta void run() usulini e'lon qiladi. Bundan tashqari, ActionListener interfeysi mavjud - bu ham funktsional. Ilgari biz funktsional interfeysni amalga oshiradigan ob'ektlarni yaratish uchun anonim sinflardan foydalanishimiz kerak edi. Lambda ifodalari bilan ishlar osonlashdi.
Har bir lambda ifodasi ba'zi funktsional interfeysga bevosita bog'lanishi mumkin. Masalan, quyidagi misolda ko'rsatilganidek, Runnable interfeysiga havola yaratishingiz mumkin:
Runnable r = () -> System.out.println("salom dunyo");
Funktsional interfeys belgilanmagan bo'lsa, bu konvertatsiya har doim bilvosita amalga oshiriladi:
new Thread(() -> System.out.println("salom dunyo").start();
Yuqoridagi misolda kompilyator Thread sinfi konstruktoridan Runnable interfeysini amalga oshirish sifatida avtomatik ravishda lambda ifodasini yaratadi: umumiy mavzu(Runnable r) ( ).
Bu erda lambda ifodalari va mos keladigan funktsional interfeyslarning ba'zi misollari:
iste'molchi c = (int x) -> ( System.out.println(x) ); BiConsumer b = (Integer x, String y) -> System.out.println(x + " : " + y); predikat p = (String s) -> ( s == null );
izoh @FunctionalInterface, Java 8-ga Java tili spetsifikatsiyasi tomonidan qo'shilgan, e'lon qilingan interfeys funktsional yoki yo'qligini tekshiradi. Bundan tashqari, Java 8 Lambda iboralari bilan foydalanish uchun bir qator tayyor funktsional interfeyslarni o'z ichiga oladi. @FunctionalInterface Agar e'lon qilingan interfeys ishlamasa, kompilyatsiya xatosi beradi.
Quyida funktsional interfeys ta'rifiga misol keltirilgan:
@FunctionalInterface umumiy interfeysi WorkerInterface (ommaviy bekor doSomeWork(); )
Ta'rifdan ko'rinib turibdiki, funktsional interfeys faqat bitta mavhum usulga ega bo'lishi mumkin. Agar siz boshqa mavhum usul qo'shmoqchi bo'lsangiz, siz kompilyatsiya xatosini olasiz. Misol:
@FunctionalInterface umumiy interfeysi WorkerInterface ( public void doSomeWork(); public void doSomeMoreWork(); )
xato:
Kutilmagan @FunctionalInterface izohi @FunctionalInterface ^ WorkerInterface funktsional interfeys emas, WorkerInterface 1 interfeysida bir nechta bekor qilinmagan mavhum usullar topildi.
Funktsional interfeys aniqlangandan so'ng, biz undan foydalanishimiz va Lambda ifodalarining barcha afzalliklarini olishimiz mumkin. Misol:
// funktsional interfeysni aniqlash @FunctionalInterface umumiy interfeysi WorkerInterface ( public void doSomeWork(); )
public class WorkerInterfaceTest ( public static void execute(WorkerInterface worker) ( worker.doSomeWork(); ) public static void main(String args) ( // anonim sinf orqali doSomeWork usulini chaqirish // (klassik) execute(yangi WorkerInterface() ( @Override public void doSomeWork() ( System.out.println("Ishchi anonim sinf orqali chaqirildi"); ) )); // Lambda ifodalari orqali doSomeWork usulini chaqiring // (Java 8 yangi) execute(() -> System .out.println("Lambda orqali chaqirilgan ishchi"); ) )
Xulosa:
Ishchi anonim sinf orqali chaqirildi Ishchi Lambda orqali chaqirildi
Bu erda biz o'z funktsional interfeysimizni aniqladik va lambda ifodasidan foydalandik. execute() usuli lambda ifodalarini argument sifatida qabul qilishga qodir.

Download 37.33 Kb.

Do'stlaringiz bilan baham:
1   ...   9   10   11   12   13   14   15   16   17




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