دروس الوحدة (1/2)
تعبيرات لامدا
بدءًا من Java 8، يتم دعم البرمجة الوظيفية عبر Lambda Expressions. تعبير لامدا هو في الأساس طريقة مجهولة (دالة بدون اسم) يمكن تمريرها كوسيطة للطرق أو تخزينها في المتغيرات.
واجهات وظيفية
لا يمكن استخدام تعبير lambda إلا عند الحاجة إلى واجهة وظيفية. الواجهة الوظيفية هي واجهة تعلن عن طريقة مجردة واحدة بالضبط. تقوم Java بوضع علامة على هذه الواجهات باستخدام التعليق التوضيحي الاختياري @FunctionalInterface.
مثال على واجهة وظيفية محددة من قبل المستخدم:
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}قبل Java 8، كان عليك تحديد فئة داخلية مجهولة. مع lambdas، تم تبسيط بناء الجملة إلى:
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، وطباعة النتيجة.
إظهار التلميح
قم بتعريف "Calculator adder = (a, b) -> a + b;" ثم قم باستدعاء "adder.calculate(5, 3)" داخل استدعاء الطباعة.
الحل متاح بعد 3 من المحاولات
قم بإنشاء مثيل للواجهة الوظيفية القياسية Predicate<String> المسماة isLong باستخدام تعبير lambda الذي يتحقق مما إذا كان طول السلسلة أكبر من 5 أحرف. ثم قم بطباعة نتيجة الاختبار لـ "hello World".
إظهار التلميح
تأخذ لامدا لـ `Predicate<String>` معلمة `s` وترجع `s.length() > 5` كشرط منطقي.
الحل متاح بعد 3 من المحاولات
قم بفرز قائمة أسماء السلاسل أبجديًا عن طريق استدعاء الأسلوبsort() عليها وتمرير تعبير lambda الذي ينفذ Comparator (أخذ سلسلتين s1 وs2 ومقارنتهما باستخدام CompareTo).
إظهار التلميح
استخدم `names.sort((s1, s2) -> s1.compareTo(s2));` لفرز القائمة في مكانها.
الحل متاح بعد 3 من المحاولات