عبارت لامبدا

عبارت لامبدا (Lambda expressions) در اصل یک متد بی نام است. این متد ناشناس به تنهایی قابل اجرا نیست و برای پیاده‌سازی متدی که در یک رابط تابعی یا functional interface تعریف‌ شده به کار می‌رود. رابط تابعی، اینترفیسی است که فقط و فقط یک متد در آن تعریف شده است. فرض کنید یک رابط تابعی به صورت زیر داریم :interface MyMessage { void ShowMessage(String message); }یک راه برای Override کردن متد این رابط استفاده از کلاس های داخلی بی نام به صورت زیر می باشد :public class MyFirstProgram { interface MyMessage { void ShowMessage(String message); } public static void main(String[] args) { MyMessage m = new MyMessage() { @Override public void ShowMessage(String message) { System.out.println(message); } }; m.ShowMessage(&quotHello World!&quot); } }Hello World!ولی یک راه ساده تر هم وجود دارد و آن استفاده از عبارات لامبدا است. در کد زیر متد ()ShowMessage با استفاده از عبارات لامبدا پیاده سازی شده است :public class MyFirstProgram { interface MyMessage { void ShowMessage(String message); } public static void main(String[] args) { MyMessage m = (message) -> System.out.println(message); m.ShowMessage(&quotHello World!&quot); } }Hello World!روش کلی استفاده از عبارات لامبدا به صورت زیر است :parameter -> expression bodyدر عبارت لامبدا ابتدا پارامترها را بدون ذکر نوعشان می نویسیم و بعد از عملگر -> استفاده می کنیم. سپس دستوراتی را که قرار است اجرا شوند را می نویسیم. نوع پارامترها به صورت خودکار به وسیله کامپایلر تشخیص داده می شود. البته امضاء عبارات لامبدا باید شبیه به امضاء متد باشد. عبارات لامبدا دارای اشکال زیادی هستند. به عنوان مثال در مثال بالا از یک عبارت لامبدایی استفاده کرده ایم که دارای یک دستور ساده اجرایی است. اگر متد شما برای عبارت لامبدا هیچ پارامتری نداشته باشد، همه کاری که لازم است نجام دهید این است که هیچ پارامتری در داخل عبارت لامبدا قرار ندهید :public class MyFirstProgram { interface MyMessage { void ShowMessage(); } public static void main(String[] args) { MyMessage m = () -> System.out.println(&quotHello World!&quot); m.ShowMessage(); } }Hello World!به این نکته توجه کنید که شما می توانید نوع پارامترهای عبارت لامبدا را نشان دهید.public class MyFirstProgram { interface MyMessage { void ShowMessage(String message); } public static void main(String[] args) { MyMessage m = (String message) -> System.out.println(message); m.ShowMessage(&quotHello World!&quot); } }Hello World!اگر عبارات لامبدای شما دارای چندین دستور اجرایی باشند می توانید آنها را داخل آکولاد قرار دهید. به عبارت لامبدایی که دارای آکولاد باشد بلاک لامبدا می گویند.public class MyFirstProgram { interface MyMessage { void ShowMessage(String message); } public static void main(String[] args) { MyMessage m = (message) -> { System.out.println(message); System.out.println(&quotSome more message&quot); }; m.ShowMessage(&quotHello World!&quot); } }Hello World! Some more messageدر زیر مثالی از یک عبارت لامبدا که دارای مقدار برگشتی است نشان داده شده است :SampleInterface GetSquare = (number) -> { return (number * number); };به این نکته توجه کنید که هنگام استفاده از دستور return باید همیشه از دستورات لامبدایی استفاده کنید که دارای آکولاد می باشند. اگر یک عبارت لامبدا فقط دارای یک دستور return ساده باشد می توانید به سادگی آن را به expression lambda تبدیل کنید.SampleInterface GetSquare = (number) -> (number * number);به این نکته توجه کنید که استفاده از پرانتز در کد بالا برای فهم بهتر آن است. اگر یک عبارت لامبدا دارای یک پارامتر ساده و یک دستور return است، می توانید برای سادگی بیشتر پرانتزها را حذف نمایید:SampleInterface GetSquare = (number) -> number * number;عبارت لامبدای بالا دارای دو پارامتر است و حاصل جمع آنها را بر می گرداند.برای تسلط کامل بر این مفهوم به این لینک مراجعه کنید