Lambda و Java 8

سلام عليكم

 مع إطلاق الإصدار الثامن من جافا (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 تعليقات

Brand creation, trend analysis & style consulting

Lorem Ipsum has been the industry's standard dummy text ever since. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since.