ماڈیول اسباق (1/2)
لیمبڈا اظہار
جاوا 8 سے شروع کرتے ہوئے، فنکشنل پروگرامنگ کو Lambda Expressions کے ذریعے سپورٹ کیا جاتا ہے۔ ایک لیمبڈا اظہار بنیادی طور پر ایک گمنام طریقہ ہے (بغیر نام کے ایک فنکشن) جسے طریقوں کی دلیل کے طور پر پاس کیا جاسکتا ہے یا متغیرات میں محفوظ کیا جاسکتا ہے۔
فنکشنل انٹرفیس
لیمبڈا ایکسپریشن صرف اس وقت استعمال کیا جا سکتا ہے جہاں فنکشنل انٹرفیس کی ضرورت ہو۔ ایک فنکشنل انٹرفیس ایک انٹرفیس ہے جو بالکل ایک تجریدی طریقہ کا اعلان کرتا ہے۔ جاوا ان انٹرفیس کو اختیاری @FunctionalInterface تشریح کے ساتھ نشان زد کرتا ہے۔
صارف کے بیان کردہ فنکشنل انٹرفیس کی مثال:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}جاوا 8 سے پہلے، آپ کو ایک گمنام اندرونی کلاس کی وضاحت کرنی ہوگی۔ لیمبڈاس کے ساتھ، نحو کو آسان بنایا گیا ہے:
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8لیمبڈا اظہار کی ساخت
لیمبڈا کی بنیادی ترکیب یہ ہے:
(parameters) -> { body }
- پیرامیٹر کے بغیر:
() -> System.out.println("Hello") - سنگل پیرامیٹر:
x -> x * 2(قوسین کو چھوڑا جا سکتا ہے) - متعدد پیرامیٹرز:
(x, y) -> x + y - ملٹی لائن باڈی: اگر باڈی میں متعدد بیانات ہوں تو منحنی خطوط وحدانی
{}اور ایک واضحreturnبیان درکار ہے۔
MathOperation detailedAddition = (a, b) -> {
System.out.println("Adding...");
return a + b;
};جاوا میں معیاری فنکشنل انٹرفیس
java.util.function پیکیج کئی بلٹ ان فنکشنل انٹرفیس فراہم کرتا ہے:
Predicate<T>:Tقسم کی دلیل کو قبول کرتا ہے اور ایک بولین (test(T t)طریقہ) لوٹاتا ہے۔Consumer<T>:Tقسم کی دلیل کو قبول کرتا ہے اور نتیجہ واپس کئے بغیر آپریشن کرتا ہے (accept(T t)طریقہ)۔Function<T, R>: ایک دلیل قبول کرتا ہےTاور نتیجہ دیتا ہےR(apply(T t)طریقہ)۔Supplier<T>: کوئی دلیل قبول نہیں کرتا ہے اورT(get()طریقہ) کی قسم کی قدر واپس کرتا ہے۔
خود ہی آزمائیں۔
ایک لیمبڈا ایکسپریشن کا استعمال کرتے ہوئے کیلکولیٹر انٹرفیس کو انسٹینٹیٹ کرکے کوڈ کو مکمل کریں جس میں دو عدد کا اضافہ ہوتا ہے۔ پھر، 5 اور 3 پاس کرنے والے کیلکولیشن کا طریقہ استعمال کریں، اور نتیجہ پرنٹ کریں۔
اشارہ دکھائیں۔
'کیلکولیٹر ایڈر = (a, b) -> a + b;' کا اعلان کریں اور پھر پرنٹ کال کے اندر 'adder.calculate(5, 3)' کی درخواست کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
اسٹینڈرڈ فنکشنل انٹرفیس Predicate<String> کی ایک مثال بنائیں جس کا نام isLong ایک لیمبڈا ایکسپریشن کا استعمال کرتے ہوئے ہے جو چیک کرتا ہے کہ آیا سٹرنگ کی لمبائی 5 حروف سے زیادہ ہے۔ پھر 'ہیلو ورلڈ' کے لیے ٹیسٹ کا نتیجہ پرنٹ کریں۔
اشارہ دکھائیں۔
ایک `Predicate<String>` کے لیے lambda ایک پیرامیٹر `s` لیتا ہے اور `s.length() > 5` کو بولین حالت کے طور پر لوٹاتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
سٹرنگز کے ناموں کی فہرست کو حروف تہجی کے مطابق ترتیب دے کر اس پر sort() طریقہ استعمال کریں اور ایک لیمبڈا ایکسپریشن پاس کریں جو Comparator کو لاگو کرتا ہے (دو سٹرنگز s1، s2 لے کر compareTo کا استعمال کرتے ہوئے ان کا موازنہ کریں)۔
اشارہ دکھائیں۔
فہرست کو جگہ پر ترتیب دینے کے لیے `names.sort((s1, s2) -> s1.compareTo(s2));` استعمال کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔