در این قسمت تیم کدگیت را با آموزش lambda در جاوا همراهی کنید. یکی از قابلیتهای اضافه شده در نسخه جدید زبان برنامهنویسی جاوا، lambda میباشد در این آموزش به معرفی این قابلیت پرداخته و در انتهای آموزش چند مثال واقعی را پیاده سازی خواهیم کرد. پیشنهاد میکنیم قبل از مطالعه این جلسه، پیشنیازهای این آموزش را مطالعه کنید:
lambda در جاوا
یکی از قابلیتهای جدید نسخه 8 جاوا lambda میباشد. با استفاده از lambda میتوان به راحتی از Collectionها استفاده کرد(عملیاتهایی همچون iterate، فیلتر و سرچ براحتی میتوان با کمک lambda پیاده سازی کرد). lambda برای پیاده سازی interfaceهایی استفاده میشود که یک متد دارند. با کمک این قابلیت دیگر نیازی به تعریف مجدد متد نیست و فقط به پیاده سازی درون متد میپردازیم. کد زیر یک نمونه interface بدون استفاده از lambda میباشد.
interface Drawable {
public void draw();
}
public class LambdaExpressionExample {
public static void main(String[] args) {
// without lambda, Drawable implementation using anonymous class
Drawable d = new Drawable() {
public void draw() {
System.out.println("Drawing ");
}
};
d.draw();
}
}
در کد بالا یک interface با یک متد نوشتیم و از کلاس تودرتو برای پیاده سازی متد draw استفاده کردیم. حال همین کار را با به کمک lambda انجام میدهیم.
interface Drawable {
public void draw();
}
public class LambdaExpressionExample2 {
public static void main(String[] args) {
// with lambda
Drawable d2 = () -> System.out.println("Drawing ");
d2.draw();
}
}
قبل از توضیح کد بالا ابتدا باید با نحوه نوشتن lambda آشنا بود. الگوی نوشتن یک lambda به صورت زیر است:
(argument-list) -> {body}
- argument-list: ورودی متد در interface، در صورت نداشتن ورودی فقط () قرار داده میشود.
- -> : نشانه به سمت پیاده سازی متد
- Body: پیاده سازی متد
حال با دانستن lambda به توضیح کد بالا میپردازیم. با استفاده از lambda میخواهیم متد draw در interface را پیاده سازی کنیم. برای این کار ابتدا ورودی متد را در نظر میگیریم و شروع به نوشتن argument-list میکنیم. در اینجا ورودی نداریم پس ورودی به صورت () در میآید سپس نشانه -> را قرار داده و کد درون متد را مینویسیم دقیقا کاری که در بالا انجام دادیم. در ابتدا ممکن است پیچیده به نظر برسد اما با چند مثال ساده میتوان به راحتی آن را استفاده کرد.
مثال Lambda
با توجه به اینکه ممکن است کمی lambda در جاوا گیج کننده باشد چند مثال را در این قسمت آوردهایم.
مثال اول چاپ عناصر یک ArrayList به کمک lambda (توجه کنید نام متغیر arrL است):
arrL.forEach(n -> System.out.println(n));
مثال دوم جمع دو عدد به کمک lambda:
interface Addable{
int add(int a,int b);
}
Addable ad1=(a,b)->(a+b);
مثال سوم شروع یک Thread با استفاده از Lambda:
Runnable r1=()-> System.out.println("Thread1 is running...");
Thread t1=new Thread(r1);
T1.start();
مثال چهارم نوشتن یک Listener برای Button:
JButton b=new JButton("click");
b.addActionListener(e-> System.out.println("Click Button Pressed"););
همانطور که در کدهای بالا میبینید بسیاری از کدهای اضافه که برای نوشتن یک Thread یا ArrayList نوشته میشد به کمک lambda حذف شده است. همچنین کد با استفاده lambda خواناتر شده و از پیچیدگی در میآید.
سورس کد: