مفهوم الـ Lambda Expressions في جافا | Java Lambda Expressions

مفهوم الـ Lambda Expressions

الـ Lambda Expressions هي إحدى أهم الميزات التي تم توفيرها إبتداءاً من الإصدار 8 في جافا.
بشكل عام, الـ Lambda Expressions هي مجرد أسلوب جديد يمكن استخدامه لتقليل حجم الكود عندما تفعل Override للدوال.


ملاحظة

عندما تستخدم برنامج الـ Netbeans أثناء كتابة كود جافا فإنه بشكل تلقائي يقترح عليك استخدام أسلوب الـ Lambda Expressions كلما كان ذلك ممكناً.

الشكل العام للـ Lambda Expressions

يمكن تعريف الـ Lambda Expressions بعدة طرق كما سترى الآن.


في حال كنت ستمرر للدالة قيمة واحدة و ستضع فيها أمراً واحداً, سيكون شكل الكود.

Argument -> Statement
	

في حال كنت ستمرر للدالة قيمة واحدة و ستضع فيها أكثر من أمر, سيكون شكل الكود.

Argument -> {
    Statements
}
	

في حال كنت ستمرر للدالة أكثر من قيمة و ستضع فيها أمراً واحداً, سيكون شكل الكود.

(Arguments List) -> Statement
	

في حال كنت ستمرر للدالة أكثر من قيمة و ستضع فيها أكثر من أمر, سيكون شكل الكود.

(Arguments List) -> {
    Statements
}
	

أمثلة شاملة


مجموعة الأمثلة الأولى

الأمثلة التالية تعلمك طريقة تعريف دالة نوعها void لا تملك أي باراميتر بأسلوب الـ Lambda Expressions.

<

Javaطريقة تعريف دالة نوعها void لا تملك أي باراميتر باستخدام الـ Lambda Expressions

في المثال التالي قمنا بتعريف إنترفيس إسمه Greetings يحتوي على دالة إسمها welcomeMessage() لا ترجع قيمة عندما يتم استدعاءها.
بعدها قمنا بإنشاء كلاس إسمه Main بداخله قمنا بإنشاء Anonymous Inner Class يطبق الإنترفيس Greetings.

ملاحظة: لم نستخدم أسلوب الـ Lambda Expressions.

المثال الأول

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public void welcomeMessage();
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // obj مع إنشاء كائن منه و تخزينه في الكائن Greetings من الإنترفيس Anonymous Inner Class هنا قمنا بإنشاء
        Greetings obj = new Greetings() {
            // welcomeMessage() للدالة Override و فعلنا
            @Override
            public void welcomeMessage() {
                System.out.println("Welcome to harmash.com");
            }
        };
 
        // welcomeMessage() هنا قمنا باستدعاء الدالة
        obj.welcomeMessage();
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome to harmash.com
		

هنا قمنا بإعادة نفس المثال السابق باستخدام أسلوب الـ Lambda Expressions.

المثال الثاني

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public void welcomeMessage();
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // welcomeMessage() لإنشاء الكائن و تعريف الدالة Lambda Expressions هنا استخدمنا أسلوب الـ
        Greetings obj = ()-> {
            System.out.println("Welcome to harmash.com");
        };
 
        // welcomeMessage() هنا قمنا باستدعاء الدالة
        obj.welcomeMessage();
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome to harmash.com
		

ملاحظة

في المثال السابق كان بإمكاننا عدم وضع أقواس البداية و النهاية عندما فعلنا Override للدالة welcomeMessage() لأننا وضعنا أمر واحد فيها.


إذاً يمكن تبديل الكود التالي.

Greetings obj = ()-> {
    System.out.println("Welcome to harmash.com");
};
	

بهذا الكود.

Greetings obj = ()->
    System.out.println("Welcome to harmash.com");
	

أو بهذا الكود.

Greetings obj = ()-> System.out.println("Welcome to harmash.com");
	


مجموعة الأمثلة الثانية

الأمثلة التالية تعلمك طريقة تعريف دالة ليس نوعها void ( أي ترجع قيمة ) لا تملك أي باراميتر بأسلوب الـ Lambda Expressions.

Javaطريقة تعريف دالة ترجع قيمة و لا تملك أي باراميتر باستخدام الـ Lambda Expressions

في المثال التالي قمنا بتعريف إنترفيس إسمه Greetings يحتوي على دالة إسمها getMessage() ترجع نص ترحيب عندما يتم استدعاءها.
بعدها قمنا بإنشاء كلاس إسمه Main بداخله قمنا بإنشاء Anonymous Inner Class يطبق الإنترفيس Greetings.

ملاحظة: لم نستخدم أسلوب الـ Lambda Expressions.

المثال الأول

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public String getMessage();
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // obj مع إنشاء كائن منه و تخزينه في الكائن Greetings من الإنترفيس Anonymous Inner Class هنا قمنا بإنشاء
        Greetings obj = new Greetings() {
            // getMessage() للدالة Override و فعلنا
            @Override
            public String getMessage() {
                return "Welcome to harmash.com";
            }
        };
 
        // getMessage() هنا قمنا بطابعة النص الذي ترجعه الدالة
        System.out.println(obj.getMessage());
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome to harmash.com
		

هنا قمنا بإعادة نفس المثال السابق باستخدام أسلوب الـ Lambda Expressions.

المثال الثاني

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public String getMessage();
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // getMessage() لإنشاء الكائن و تعريف الدالة Lambda Expressions هنا استخدمنا أسلوب الـ
        Greetings obj = ()-> {
            return "Welcome to harmash.com";
        };
 
        // getMessage() هنا قمنا بطابعة النص الذي ترجعه الدالة
        System.out.println(obj.getMessage());
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome to harmash.com
		

ملاحظة

في المثال السابق كان بإمكاننا عدم وضع أقواس البداية و النهاية و الجملة return عندما فعلنا Override للدالة getMessage() لأننا وضعنا أمر واحد فيها.


إذاً يمكن تبديل الكود التالي.

Greetings obj = ()-> {
    return "Welcome to harmash.com";
};
	

بهذا الكود.

Greetings obj = ()-> return "Welcome to harmash.com";
	


مجموعة الأمثلة الثالثة

الأمثلة التالية تعلمك طريقة تعريف دالة نوعها void و تملك بارامتير واحد بأسلوب الـ Lambda Expressions.

Javaطريقة تعريف دالة نوعها void تملك باراميتر واحد باستخدام الـ Lambda Expressions

في المثال التالي قمنا بتعريف إنترفيس إسمه Greetings يحتوي على دالة إسمها welcomeUser() عند استدعاءها نعطيها إسم شخص فتطبع رسالة ترحيب صغيرة بإسم هذا الشخص.
بعدها قمنا بإنشاء كلاس إسمه Main بداخله قمنا بإنشاء Anonymous Inner Class يطبق الإنترفيس Greetings.

ملاحظة: لم نستخدم أسلوب الـ Lambda Expressions.

المثال الأول

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public void welcomeUser(String userName);
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // obj مع إنشاء كائن منه و تخزينه في الكائن Greetings من الإنترفيس Anonymous Inner Class هنا قمنا بإنشاء
        Greetings obj = new Greetings() {
            // welcomeUser() للدالة Override و فعلنا
            @Override
            public void welcomeUser(String userName) {
                System.out.println("Welcome " + userName);
            }
        };
 
        // welcomeUser() هنا قمنا باستدعاء الدالة
        obj.welcomeUser("Mhamad");
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome Mhamad
		

هنا قمنا بإعادة نفس المثال السابق باستخدام أسلوب الـ Lambda Expressions.

المثال الثاني

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public void welcomeUser(String userName);
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // welcomeUser() لإنشاء الكائن و تعريف الدالة Lambda Expressions هنا استخدمنا أسلوب الـ
        Greetings obj = (userName)-> {
            System.out.println("Welcome " + userName);
        };
 
        // welcomeUser() هنا قمنا باستدعاء الدالة
        obj.welcomeUser("Mhamad");
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome Mhamad
		

ملاحظة

في المثال السابق كان بإمكاننا عدم وضع أقواس البداية و النهاية عندما فعلنا Override للدالة welcomeUser() لأننا وضعنا أمر واحد فيها.


إذاً يمكن تبديل الكود التالي.

Greetings obj = (userName)-> {
    System.out.println("Welcome " + userName);
}
	

بهذا الكود.

Greetings obj = (userName)->
    System.out.println("Welcome " + userName);
	

أو بهذا الكود.

Greetings obj = (userName)-> System.out.println("Welcome " + userName);
	


مجموعة الأمثلة الرابعة

الأمثلة التالية تعلمك طريقة تعريف دالة ليس نوعها void ( أي ترجع قيمة ) و تملك بارامتير واحد بأسلوب الـ Lambda Expressions.

Javaطريقة تعريف دالة ترجع قيمة و تملك باراميتر واحد باستخدام الـ Lambda Expressions

في المثال التالي قمنا بتعريف إنترفيس إسمه Greetings يحتوي على دالة إسمها welcomeUser() عند استدعاءها نعطيها إسم شخص فترجع رسالة ترحيب صغيرة بإسم هذا الشخص.
بعدها قمنا بإنشاء كلاس إسمه Main بداخله قمنا بإنشاء Anonymous Inner Class يطبق الإنترفيس Greetings.

ملاحظة: لم نستخدم أسلوب الـ Lambda Expressions.

المثال الأول

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public String welcomeUser(String userName);
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // obj مع إنشاء كائن منه و تخزينه في الكائن Greetings من الإنترفيس Anonymous Inner Class هنا قمنا بإنشاء
        Greetings obj = new Greetings() {
            // welcomeUser() للدالة Override و فعلنا
            @Override
            public String welcomeUser(String userName) {
                return "Welcome " + userName;
            }
        };
 
        // welcomeUser() هنا قمنا باستدعاء الدالة
        System.out.println( obj.welcomeUser("Mhamad") );
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome Mhamad
		

هنا قمنا بإعادة نفس المثال السابق باستخدام أسلوب الـ Lambda Expressions.

المثال الثاني

Greetings.java
public interface Greetings {
 
    // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    public String welcomeUser(String userName);
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // welcomeUser() لإنشاء الكائن و تعريف الدالة Lambda Expressions هنا استخدمنا أسلوب الـ
        Greetings obj = (userName)-> {
            return "Welcome " + userName;
        };
 
        // welcomeUser() هنا قمنا باستدعاء الدالة
        System.out.println( obj.welcomeUser("Mhamad") );
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Welcome Mhamad
		

ملاحظة

في المثال السابق كان بإمكاننا عدم وضع أقواس البداية و النهاية و الجملة return عندما فعلنا Override للدالة welcomeUser() لأننا وضعنا أمر واحد فيها.


إذاً يمكن تبديل الكود التالي.

Greetings obj = (userName)-> {
    return "Welcome " + userName;
};
	

بهذا الكود.

Greetings obj = (userName)-> { return "Welcome " + userName; };
	

أو بهذا الكود.

Greetings obj = (userName)-> "Welcome " + userName; 
	


مجموعة الأمثلة الخامسة

الأمثلة التالية تعلمك طريقة تعريف دالة تأخذ أكثر من بارامتير بأسلوب الـ Lambda Expressions.

<

Javaطريقة تعريف دالة تأخذ أكثر من بارامتير بأسلوب الـ Lambda Expressions

في المثال التالي قمنا بتعريف إنترفيس إسمه Operations يحتوي على دالة إسمها sum() عند استدعاءها نعطيها عددين فترجع ناتج جمعهما.
بعدها قمنا بإنشاء كلاس إسمه Main بداخله قمنا بإنشاء Anonymous Inner Class يطبق الإنترفيس Operations.

ملاحظة: لم نستخدم أسلوب الـ Lambda Expressions.

المثال الأول

Operations.java
public interface Operations {
 
    // Operations في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    int sum(int a, int b);
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // obj مع إنشاء كائن منه و تخزينه في الكائن Operations من الإنترفيس Anonymous Inner Class هنا قمنا بإنشاء
        Operations obj = new Operations() {
            // sum() للدالة Override و فعلنا
            @Override
            public int sum(int a, int b) {
                return a+b;
            }
        };
 
        // لطباعة ناتج العددين 3 و 4 sum() هنا قمنا باستدعاء الدالة
        System.out.println( obj.sum(3,4) );
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

7
		

هنا قمنا بإعادة نفس المثال السابق باستخدام أسلوب الـ Lambda Expressions.

المثال الثاني

Operations.java
public interface Operations {
 
    // Operations في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها
    int sum(int a, int b);
 
}
		

Main.java
public class Main {
 
    public static void main(String[] args) {
 
        // sum() لإنشاء الكائن و تعريف الدالة Lambda Expressions هنا استخدمنا أسلوب الـ
        Operations obj = (int a, int b)-> {
            return a+b;
        };
 
        // لطباعة ناتج العددين 3 و 4 sum() هنا قمنا باستدعاء الدالة
        System.out.println( obj.sum(3,4) );
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

7
		

ملاحظة

في المثال السابق كان بإمكاننا عدم تحديد أنواع الباراميترات و عدم وضع أقواس البداية و النهاية و الجملة return عندما فعلنا Override للدالة sum() لأننا وضعنا أمر واحد فيها.


إذاً يمكن تبديل الكود التالي.

Operations obj = (int a, int b)-> {
    return a+b;
};
	

بهذا الكود.

Operations obj = (a, b)-> {
    return a+b;
}; 
	

أو بهذا الكود.

Operations obj = (a, b)-> return a+b;
	
>شاهد الأمثلة »



مجموعة الأمثلة السادسة

الأمثلة التالية تعلمك طريقة إستخدام الدالة forEach() بأسلوب الـ Lambda Expressions للوصول إلى عناصر أي كلاس من الكلاسات التي تطبق الإنترفيس Collection.

Javaطريقة إستخدام الدالة forEach() بأسلوب الـ Lambda Expressions

في البداية, الدالة forEach() هي دالة موجودة في الإنترفيس Collection و هذا يعني أن جميع الكلاسات المشتقة منه ( مثل ArrayList, LinkedList إلخ.. ) تملكها.
الدالة forEach() تجعلك قادراً على الوصول إلى عناصر الكائن المشتق من الإنترفيس Collection واحداً تلو الآخر.

في المثال التالي قمنا بتعريف كائن من الكلاس ArrayList إسمه names و وضعنا فيه 4 أسماء.
بعدها قمنا بعرض الأسماء المخزنة بداخل الكائن names بعدة طرق.


المثال

Main.java
import java.util.ArrayList;
 
public class Main {
 
    public static void main(String[] args) {
 
        // names إسمه ArrayList هنا قمنا بإنشاء كائن من الكلاس
        ArrayList<String> names = new ArrayList();
 
        // names هنا قمنا بإضافة 4 أسماء في الكائن
        names.add("Mhamad");
        names.add("Hala");
        names.add("Ahmad");
        names.add("Racha");
 
        // names العادية لعرض جميع عناصر الكائن for هنا قمنا باستخدام الحلقة
        for(int i=0; i<names.size(); i++) {
            System.out.println( names.get(i) );
        }
 
        System.out.println("-----------------------" );
 
        // names لعرض جميع عناصر الكائن for each هنا قمنا باستخدام الحلقة
        for(String s: names) {
            System.out.println( s );
        }
 
        System.out.println("-----------------------" );
 
        // names لعرض جميع عناصر الكائن forEach هنا قمنا باستخدام الدالة
        names.forEach((s) -> {
            System.out.println( s );
        });
 
        System.out.println("-----------------------" );
 
        // names لعرض جميع عناصر الكائن forEach هنا قمنا باستخدام الدالة
        names.forEach(
            s-> System.out.println( s )
        );
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

Mhamad
Hala
Ahmad
Racha
-----------------------
Mhamad
Hala
Ahmad
Racha
-----------------------
Mhamad
Hala
Ahmad
Racha
-----------------------
Mhamad
Hala
Ahmad
Racha
		


Javaخطوتك التالية بعد تعلم لغة جافا

بناء تطبيقات فيها واجهة مستخدم بلغة جافا

إذا قمت باتباع جميع التعليمات التي وضعناها لك خطوة خطوة و وصلت إلى هنا, فهذا يعني أنك حقاً أصبحت مستعداً لبناء تطبيقات فيها واجهة مستخدم لأنك تعلمت جميع التقنيات الأساسية التي ستحتاجها و التي ستطبقها على الأغلب في كل تطبيق تقوم ببنائه.

لبناء تطبيقات فيها واجهة مستخدم بالإعتماد على لغة جافا عندك خيارين:

  • إستخدام المكتبة Swing.

  • إستخدام المكتبة JavaFX.

في البداية التطبيق الذي تستطيع بناءه باستخدام المكتبة Swing, تستطيع بناءه أيضاً باستخدام المكتبة JavaFX و العكس صحيح.
كما أن تعلّم كليهما أمر سهل جداً و ليس معقداً كتعلم لغة جافا.

من الأفضل Swing أم JavaFX ؟

المكتبة JavaFX هي أحدث مكتبة تم تطويرها لبناء تطبيقات فيها واجهة مستخدم و هي تعتبر أفضل من المكتبة Swing لأنها تحتوي أشياء و تقنيات جاهزة يمكنك الإستفادة منها بدل بنائها من الصفر. كما أن الكود الذي تحتاج كتابته لبناء التطبيق باستخدام المكتبة JavaFX في العادة يكون أصغر في الحجم و أقل تعقيداً.

هل يجب تعلم بناء تطبيقات باستخدام المكتبة Swing ؟

الطلاب في الجامعات يطلب منهم في العادة بناء تطبيقات بواسطة المكتبة Swing بسبب قلة المصادر التي توفر شروحات JavaFX.
بالإضافة إلى ذلك, الجامعة تعتبر أنه من يتعلم Swing سيجد تعلم JavaFX أمر سهل جداً.

بعيداً عن الجامعات, في حياتك العملية قد تعمل مع شركة سبق لها أن قامت ببناء برامج ضخمة باستخدام المكتبة Swing و كل فترة تقوم بتحديث هذه البرامج لعملائها. في هذه الحالة ستكون مجبراً على تعلم بناء تطبيقات باستخدام المكتبة Swing حتى تكون قادراً على تولي أي مهمة تطلب منك و بالتالي الحفاظ على وظيفتك.

تعلم Swing و JavaFX من الصفر

ننصحك بتعلم المكتبة Swing ثم تعلم المكتبة JavaFX حتى تكون جاهزاً لأي مهمة تطلب منك في المستقبل.

هنا دورة Swing تعلمها الآن »

هنا دورة JavaFX تعلمها الآن »