(Lambda expressions) تعبيرات اللامدا

منذ بداية لغة الجافا ١٩٩٦ ويواصل مطوروا اللغة تطويرها وزيادة العديد من الخصائص المهمة فيها ولكن هناك تغييرات أدت إلى نقلة كبيرة في اساسيات اللغة نفسها حتى إنها غيرت طريقة كتابة أكواد اللغة نفسها! وأكبر تغيير وتطوير تم في لغة جافا منذ إنشائها إلى الآن هو إضافة ال Generics وكان ذلك في العام ٢٠٠٤ عند إطلاق جافا ٥ والمسمى ب “Tiger” والإضافة الكبيرة الثانية كانت في العام ٢٠١٤ عند إطلاق جافا ٨ وكانت هي إضافة تعبيرات لامدا (Lambda expressions) والتي نحن بصدد الكلام عنها اليوم ،

ولكي نفهم تعبيرات لامدا لابد لنا من معرفة ال functional interface وهي interface عادية لكن فيها دالة واحدة فقط مثل ال Runnable interface الذي يستخدم في ال Threading في الجافا ،

وتعبير اللامدا (lambda expression) هي دالة مجهولة (anonymous or unnammed) ، وهذه الدالة لايتم تنفيذها هي نفسها ولكنها تُستخدم لتطبيق (implement) الدالة المُعرفة في ال functional interface وسيتضح هذا التعريف مع الأمثلة إن شاء الله.

تعبيرات لامدا أضافت تركيبات (syntax) ومعاملات (operator) جديدة للغة الجافا ، المُعامل الجديد يُسمى lambda operator وهو


->

وتُقرأ  (becomes) أو (goes to )

وهذا المُعامِل يقوم بتقسيم تعبير اللامدا إلى جزئين : الجزء الذي على اليسار يتم في تحديد المُدخلات (parameters) المطلوبة لتعبير اللامدا وأما الجزء على يمين المُعامِل هو جسم تعبير اللامدا نفسه (lambda experssion body) .

لنعط مثالاً على ما سبق :

اولا نقوم بتعريف ال functional interface


interface MyFunctional {

        double getValue();

}

 ثم نقوم بتعريف تعبير اللامدا


MyFunctional fun ;

fun = () ->  43.2;

لأن الدالة الموجودة في ال functional interface لا تستقبل أي متغيرات لم نقم بتمرير اي قيم لمدخلات اللامدا واستخدمنا اقواس خالية () وفي الجانب الأيمن من مُعامِل لامدا أرجعنا القيمة 43.2  لأن الدالة تقوم بإرجاع متغير من نوع double مع ملاحظة أننا لم نقم بكتابة return لأن جسم اللامدا () لاتوجد فيه إلا عبارة واحدة (وهذا النوع يُسمى single expression lambda) وأما إن كان فيه أكثر من أمر (وهذا النوع يُسمى block lambda expression) فحينئذ نستخدم أقواس البداية والنهاية ونجعل return في النهاية كما في هذا المثال :


fun = () -> {

   double t = 100;

   double r = Math.random() * t ;

   System.out.println("lambda expression body");

   return r ;

}

double  value = fun.getValue();

System.out.println("value = "+value);

مثال آخر لتعبير لامدا يستقبل متغير


interface LambdaInterface {

boolean test(int n);

}

ونقوم بإستخدامه كالآتي :


LambdaInterface isEven = (n) -> (n%2) == 0;

if(isEven.test(10)) System.out.println("is even number");

if(!isEven.test(9)) System.out.println("is not even");

LambdaInterface isNonNeg = (n) -> n >=0 ;

if(isNonNeg.test(1)) System.out.println("not negative");

if(!isNonNeg.test(-1)) System.out.println("negative");

بدون هذه تعبيرات اللامدا كنا نقوم بإنشاء ما يُسمى بالكلاس المجهول (anonymous class) وأما الآن فلا حاجة للكلاس المجهول، وهذا مثال لإنشاء Thread بدون اللامدا ومرة بإستخدامه

بدون اللامدا :


Runnable myRunnable = new Runnable(){

public void run(){

System.out.println("Runnable running");

}

}

Thread thread = new Thread(myRunnable);

thread.start();

واما بإستخدام اللامدا


Thread thread = new Thread(

()->{ System.out.println("Runnable running");}  );

thread.start();

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s