لامبدا (Lambda)
«لامبدا در جاوا» یک تکه کد کوتاه و بی نام است. این کد ورودی می گیرد و خروجی می دهد. همچنین داخل بدنه متد نوشته می شود. این ویژگی از جاوا 8 اضافه شد.
لامبدا در جاوا چیست؟
«لامبدا (Lambda Expression)» شبیه متد است اما نام ندارد. بنابراین خواندن کد را ساده می کند. همچنین ارسالِ رفتار به متدها را راحت می کند.
سینتکس پایه
برای یک پارامتر و یک عبارت از این الگو استفاده می شود.
parameter -> expression
برای چند پارامتر، آن ها را داخل پرانتز می گذاریم.
(parameter1, parameter2) -> expression
برای کارهای پیچیده، از بلاک کد استفاده کن. اگر خروجی لازم است، از return استفاده کن.
(parameter1, parameter2) -> {
return result;
}
استفاده روزمره با forEach
لامبدا را می توان به متدها فرستاد. برای نمونه، در forEach() لیست استفاده می کنیم.
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
numbers.forEach((n) -> {
System.out.println(n);
});
}
}
گام های تمرینی
- یک عدد جدید به لیست اضافه کن.
- داخل لامبدا، مربع عدد را چاپ کن.
- کد را اجرا کن و نتیجه را ببین.
ذخیره لامبدا در متغیر
لامبدا در متغیر می نشیند. نوعِ متغیر باید «رابط تابعی (Functional Interface)» باشد. این رابط دقیقاً یک متد انتزاعی دارد.
import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
Consumer<Integer> method = (n) -> {
System.out.println(n);
};
numbers.forEach(method);
}
}
ارسال لامبدا به متد
می توان لامبدا را به پارامتر متد داد. پارامتر باید رابط تابعی باشد. سپس با صدا زدن متد رابط، لامبدا اجرا می شود.
interface StringFunction {
String run(String str);
}
public class Main {
public static void main(String[] args) {
StringFunction exclaim = (s) -> {
return s + "!";
};
StringFunction ask = (s) -> {
return s + "?";
};
printFormatted("Hello", exclaim);
printFormatted("Hello", ask);
}
public static void printFormatted(String str, StringFunction format) {
String result = format.run(str);
System.out.println(result);
}
}
کلاس ناشناس یا لامبدا؟
در جاوا 8 به بعد، معمولاً لامبدا کوتاه تر است. اما فقط برای رابط های تابعی مناسب است.
کلاس ناشناس
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting g = new Greeting() {
public void sayHello() {
System.out.println("Hello from anonymous class");
}
};
g.sayHello();
}
}
لامبدا
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting g = () -> {
System.out.println("Hello from lambda");
};
g.sayHello();
}
}
نکته: اگر چند متد لازم داری، از کلاس ناشناس استفاده کن. اگر یک متد کافی است، لامبدا انتخاب خوبی است.
برای پیش نیازها به رشته ها سر بزن. همچنین برای مرور «لامبدا در جاوا» این صفحه را ذخیره کن. سپس ادامه را در مرتب سازی پیشرفته دنبال کن.
جمع بندی سریع
- لامبدا کد کوتاه و بی نام است.
- برای رابط های تابعی مناسب است.
- در forEach خیلی کاربردی است.
- می تواند در متغیر ذخیره شود.
- می تواند پارامتر متد باشد.