الانتقال إلى المحتوى الرئيسي
الوحدة 7 · الدرس 1 من 213/14 في الدورة~12 min
دروس الوحدة (1/2)

تعبيرات لامدا

بدءًا من Java 8، يتم دعم البرمجة الوظيفية عبر Lambda Expressions. تعبير لامدا هو في الأساس طريقة مجهولة (دالة بدون اسم) يمكن تمريرها كوسيطة للطرق أو تخزينها في المتغيرات.

واجهات وظيفية

لا يمكن استخدام تعبير lambda إلا عند الحاجة إلى واجهة وظيفية. الواجهة الوظيفية هي واجهة تعلن عن طريقة مجردة واحدة بالضبط. تقوم Java بوضع علامة على هذه الواجهات باستخدام التعليق التوضيحي الاختياري @FunctionalInterface.

مثال على واجهة وظيفية محددة من قبل المستخدم:

Java
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

قبل Java 8، كان عليك تحديد فئة داخلية مجهولة. مع lambdas، تم تبسيط بناء الجملة إلى:

Java
MathOperation addition = (a, b) -> a + b;
int result = addition.operate(5, 3); // Returns 8

هيكل تعبيرات لامدا

بناء جملة لامدا الأساسي هو:

Code
(parameters) -> { body }
  • بدون معلمات: () -> System.out.println("Hello")
  • معلمة واحدة: x -> x * 2 (يمكن حذف الأقواس)
  • معلمات متعددة: (x, y) -> x + y
  • نص متعدد الأسطر: إذا كان النص يحتوي على عبارات متعددة، فيجب استخدام الأقواس {} وعبارة return الصريحة.
Java
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()).

جربه بنفسك

تمرين#java.m7.l1.e1
المحاولات: 0جارٍ التحميل…

أكمل التعليمات البرمجية عن طريق إنشاء واجهة الحاسبة باستخدام تعبير لامدا الذي يضيف عددين صحيحين. ثم، قم باستدعاء طريقة الحساب بتمرير 5 و 3، وطباعة النتيجة.

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف "Calculator adder = (a, b) -> a + b;" ثم قم باستدعاء "adder.calculate(5, 3)" داخل استدعاء الطباعة.

الحل متاح بعد 3 من المحاولات

تمرين#java.m7.l1.e2
المحاولات: 0جارٍ التحميل…

قم بإنشاء مثيل للواجهة الوظيفية القياسية Predicate<String> المسماة isLong باستخدام تعبير lambda الذي يتحقق مما إذا كان طول السلسلة أكبر من 5 أحرف. ثم قم بطباعة نتيجة الاختبار لـ "hello World".

جارٍ تحميل المحرر…
إظهار التلميح

تأخذ لامدا لـ `Predicate<String>` معلمة `s` وترجع `s.length() > 5` كشرط منطقي.

الحل متاح بعد 3 من المحاولات

تمرين#java.m7.l1.e3
المحاولات: 0جارٍ التحميل…

قم بفرز قائمة أسماء السلاسل أبجديًا عن طريق استدعاء الأسلوبsort() عليها وتمرير تعبير lambda الذي ينفذ Comparator (أخذ سلسلتين s1 وs2 ومقارنتهما باستخدام CompareTo).

جارٍ تحميل المحرر…
إظهار التلميح

استخدم `names.sort((s1, s2) -> s1.compareTo(s2));` لفرز القائمة في مكانها.

الحل متاح بعد 3 من المحاولات