مفهوم الـ 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.
المثال الأول
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public void welcomeMessage(); }
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.
المثال الثاني
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public void welcomeMessage(); }
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.
المثال الأول
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public String getMessage(); }
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.
المثال الثاني
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public String getMessage(); }
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.
المثال الأول
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public void welcomeUser(String userName); }
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.
المثال الثاني
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public void welcomeUser(String userName); }
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.
المثال الأول
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public String welcomeUser(String userName); }
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.
المثال الثاني
public interface Greetings { // Greetings في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها public String welcomeUser(String userName); }
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.
المثال الأول
public interface Operations { // Operations في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها int sum(int a, int b); }
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.
المثال الثاني
public interface Operations { // Operations في أي كلاس سيطبق الإنترفيس Override هذه الدالة يجب أن نفعل لها int sum(int a, int b); }
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
بعدة طرق.
المثال
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 تعلمها الآن »