سلام عليكم
مع إطلاق الإصدار الثامن من جافا (java 8) كان أكثر شيء جلب انتباه المطورين هو إضافة تقنية lambda التي هي موجودة في اللغات التي توصف بأنها functional
أصل المشكلة التي حلتها lambda
في الجافا لا يمكننا أن نمرر باراميتر parametre إلى أي دالة إلا احد اثنين إما :
مؤشر (référence) نحو متغير أولي
أو مؤشر نحو كائن
int x; String y;
ولا يمكننا أن نمرر دالة كبراميتير إلى دالة اخرى
لان الجافا لغة كائنية 100/100 فكل شيء فيها هو كائن
كيف كانت تتعامل الجافا مع مثل هذه المشكلة قبل الإصدار الثامن
في الطريقة التقليدية عندما نريد ان نمرر دالة إلى دالة أخرى كنا نقوم بخطوتين
أولا إنشاء interface يحتوي دالة واحدة (هي التي ستُمرَر)
ثانيا نقوم ب implimentation للأنترفاس داخل قوسي الدالة الأم
وللتوضيح نأخذ المثال الأكثر شهرة في الجافا وهو عندما نريد إنشاء thread
من قرأ جيدا فصول الجافا se يعرف أنه إذا اراد إنشاء thread
فإما أن يرث كلاس جديد من الكلاس Thread وهذ الطريقة ليست مما نحن فيه
وإما أن يقوم ب implimentation لل interface --->Runnable
هذه هي Runnable Interface
public interface Runnable {
public abstract void run();
}
وهذه هي الطريقة التي وصفتها
public class JavaApplication5
{
public static void main(String[] args)
{
Thread th = new Thread(new Runnable()
{
@Override
public void run()
{
System.out.print("Salam ahmed");
}
});
th.start();
}
}
الآن مع التقنية الحديثة صار الأمر اسهل ،
وإليكم طريقة إنشاء ثريد بالتقنية lambda
public class JavaApplication5
{
public static void main(String[] args)
{
Thread th2 = new Thread(() -> System.out.println("Salam ahmed !"));
th2.start();
}
}
هكذا أفضل اليس كذالك
ما هي lambda ؟
Lambda هي دالة مجهولة (anonymous function)
ننشأها لأداء مهمة ما ، وجودها يكون مؤقتا فقط لأداء تلك المهمة
Syntaxe
الكتابة العامة للدالة lambda هي
(paramètres) -> expression_simple
أو
(paramètres) -> { bloc_d'instructions }
أمثلة ذلك
(x) -> x * 2 #1
(x) -> { return x * 2; } #2
(s) -> { System.out.println(s); } #3
() -> 42 #4
الأولى تستقبل الدالة متغير من نوع int وترجع بقيمة واحدة تلقائيا هي قيمة العملية الحسابية وفي هذه الحالة لا نحتاج لا إلى معقوفتين ولا إلى return
الثانية مثل الأولى إلا اننا استعملنا المعقوفتين { } وفي هذه الحالة يجب وضع الكلمة return
الثالثة تستقبل arg من نوع string ولا ترجع بشيء يعني هي مثل void
الرابعة لا تستقبل اي arg وترجع بثاب هو 42
استعمالات lambda
إحدى أكثر الاستعملات التي ستطبق فيها هي ما رايناه سابقا وستستعمل أيضا بكثرة في
Listener Lambda
في الطريقة التقليدية كنا نقوم ب impl للأنترفاس ActionListener عند حدث الضغط على زر (button)
هكذا
JButton greeterButton = new JButton("Click me !");
greeterButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
JOptionPane.showMessageDialog(null, "Hello !");
}
});
ومع lambda صارت هكذا
JButton greeterButton = new JButton("Click me !");
greeterButton.addActionListener( event -> {
JOptionPane.showMessageDialog(null, "Hello !");
});
envet هو البراميتر التي تستقبله الدالة |المجهولة lambda
مراجع
http://viralpatel.net/blogs/lambda-expressions-java-tutorial/
http://blog.zenika.com/index.php?post/2012/05/30/Java-8-et-les-Lambda

0 تعليقات