لامبادا

آموزش عبارات لامبدا در جاوا (Lambda Expressions)

folderشی گرایی
comments1 دیدگاه
اساطیر زبان

در این آموزش ، در مورد ویژگی جدید معرفی شده در جاوا ۸ ، یعنی پشتیبانی از عبارات لامبدا با استفاده از رابط کاربری خواهید آموخت.

هنگام انتشار جاوا ۸ ، عبارات لامبدا موضوع داغی بود. عبارات لامبدا در JDK نسخه ۸ اضافه شده است تا با افزایش قدرت بیان زبان ، عملکرد جاوا را تقویت کنید.

 


جاوا

توی این پک فوق العاده، جاوا رو جوری یاد میگیری که تو هیچ کلاس آموزشی یا پک دیگه ای نه دیدی نه شنیدی! بدون هیچ کلاسی، با جاوا اپلیکیشن بزن، پروژه محور یاد بگیر و حسابی پول در بیار! 


 

اما ، قبل از ورود به لامبدا ، ابتدا باید بدانیم که رابط کاربری چیست.

رابط کاربری یا اینترفیس چیست؟

اگر یک اینترفیس جاوا شامل فقط یک متد انتزاعی(abstract) باشد ، آن را اینترفیس تابعی می نامند. به عنوان مثال ، اینترفیس Runnable از پکیج ؛java.lang یک اینترفیس تابعی است زیرا تنها یک متد یعنی ()run را تشکیل می دهد.

مثال ۱ : یک رابط کاربری یا اینترفیس در جاوا تعریف کنید

  1. import java.lang.FunctionalInterface;
  2. @FunctionalInterface
  3. public interface MyInterface{
  4. double getValue();
  5. }

توجه: حاشیه نویسی FunctionalInterface@ ضروری نیست ، اما استفاده از آن عاقلانه است زیرا کامپایلر جاوا را وادار می کند که اینترفیس تعریف شده اینترفیس تابعی باشد و فقط باید یک متد انتزاعی داشته باشد. در جاوا ۷ ، به اینترفیس Abstract Method Single یا SAM type گفته می شد.

SAM معمولاً با کلاس های ناشناس در جاوا ۷ اجرا می شد.

مثال ۲: SAM را با کلاس های ناشناس در جاوا اجرا کنید

  1. public class FunctionInterfaceTest {
  2. public static void main(String[] args) {
  3. new Thread(new Runnable() {
  4. @Override
  5. public void run() {
  6. System.out.println(“I just implemented the Runnable Functional Interface.”);
  7. }
  8. }).start();
  9. }
  10. }

امکان ارسال یک کلاس ناشناس به سازنده یا متد ، نوشتن کد جاوا ۷ را با فایل های کمتری آسان کرد. با این حال ، ساختار همچنان دشوار و کد بسیاری مورد نیاز بود.

جاوا ۸ با یک قدم جلوتر رفتن ، قدرت یک SAM را افزایش داد. از آنجا که می دانیم اینترفیس فقط یک متد دارد ، نیازی به تعریف نام آن متد در هنگام ارسال آن به عنوان آرگومان نیست. عبارت لامبدا به ما امکان می دهد دقیقاً همین کار را انجام دهیم.

آشنایی با عبارت لامبدا

عبارت لامبدا در اصل متدی ناشناس یا نامشخص است و به تنهایی اجرا نمی شود. در عوض ، از آن برای پیاده سازی متد تعریف شده توسط اینترفیس استفاده می شود.

چگونه عبارت لامبدا را در جاوا تعریف کنیم؟

عبارت لامبدا یک عنصر نحوی جدید و اپراتور را به زبان جاوا معرفی می کند. به اپراتور جدید عملگر لامبدا یا عملگر پیکان گفته می شود. (->)

بیایید یک متد ساده بنویسیم که فقط یک مقدار ثابت double را برگرداند.

double getPiValue() { return 3.1415; }

عبارت لامبدا معادل متد فوق عبارت است از:

() -> 3.1415

در عبارت لامبدا ، سمت چپ عبارت پارامترهای موردنیاز عبارت را مشخص می کند ، در حالی که سمت راست بدنه ی لامبدا است ، که عملکرد عبارت لامبدا را مشخص می کند.

بدنه لامبدا از دو نوع است.

۱- بدنه با یک عبارت واحد

() -> System.out.println(“Lambdas are great”);

۲- بدنه تشکیل شده از یک بلوک کد

() -> {

double pi = 3.1415;

return pi;

}

یک عبارت لامبدا می تواند پارامتر داشته باشد.مثلا :

(n) -> (n%2)==0

این عبارت لامبدا مشخص می کند که مقدار n زوج یا فرد است.

اگر بدنه ی لامبدا یک بلوک کد است ، همیشه باید یک مقدار را برگردانید. اما ، اگر بدنه ی لامبدا فقط یک عبارت است ، مقدار بازگشتی لازم نیست.

بیایید کد جاوا را با عبارت لامبدا بنویسیم که مقدار Pi را بر می گرداند.

همانطور که قبلا ذکر شد ، عبارت لامبدا به تنهایی اجرا نمی شود. در عوض ، اجرای متد انتزاعی تعریف شده توسط اینترفیس تابعی را تشکیل می دهد.

مثال ۳ : عبارت لامبدا را با رابط کاربری(اینترفیس) در جاوا تعریف کنید

در ابتدا باید یک رابط کاربری MyInterface.java تعریف کنیم:

  1. import java.lang.FunctionalInterface;
  2. // This is functional interface
  3. @FunctionalInterface
  4. public interface MyInterface{
  5. double getPiValue();
  6. }

حال ، عبارت لامبدا را به عنوان مثال اینترفیس تابعی اختصاص می دهیم.

  1. public class LambdaMain {
  2. public static void main( String[] args ) {
  3. MyInterface myInterface;
  4. myInterface = () -> 3.1415;
  5. System.out.println(“Value of Pi = ” + myInterface.getPiValue());
  6. }
  7. }

خروجی برابر است با:

Value of Pi = 3.1415

عبارت لامبدا باید با متد انتزاعی سازگار باشد. یعنی اگر () -> “۳٫۱۴۱۵” را به نمونه myInterface اختصاص دهید ، کد ایراد دارد و اجرا نخواهد شد زیرا طبق تعریف در اینترفیس، نوع رشته با double سازگار نیست.

شما احتمالا از یک عبارت لامبدا مانند کد بالا در یک برنامه واقعی استفاده نمی کنید. بیایید به مثال دیگری از عبارت لامبدا که پارامتر می گیرد نگاهی بیندازیم.

مثال ۴ : استفاده از عبارت لامبدا با پارامترهای موجود در جاوا

  1. @FunctionalInterface
  2. interface MyInterface {
  3. String reverse(String n);
  4. }
  5. public class ParamLambdaMain {
  6. public static void main( String[] args ) {
  7. MyInterface myInterface = (str) -> {
  8. String result = “”;
  9. for (int i = str.length()-1; i >= 0 ; i–)
  10. result += str.charAt(i);
  11. return result;
  12. };
  13. System.out.println(“Lambda reversed = ” + myInterface.reverse(“Lambda”));
  14. }
  15. }

خروجی

Lambda reversed = adbmaL

اینترفیس تابعی عمومی

اینترفیس بالا فقط String را می پذیرد و شی String را برمی گرداند. با این حال ، ما می توانیم رابط کاربری عمومی ایجاد کنیم، به طوری که هر نوع داده پذیرفته شود.

مثال ۵ : چگونه رابط کاربری می تواند هر نوع داده را در جاوا بپذیرد؟

بیایید ببینیم که چگونه این کار انجام شده است:

  1. // GenericInterface.java
  2. @FunctionalInterface
  3. interface GenericInterface<T> {
  4. T func(T t);
  5. }

حال ، GenericInterface با هر عبارت لامبدا که یک پارامتر را می گیرد سازگار است و مقدار همان نوع را بر می گرداند.

  1. // GenericLambda.java
  2. public class GenericLambda {
  3. public static void main( String[] args ) {
  4. GenericInterface<String> reverse = (str) -> {
  5. String result = “”;
  6. for (int i = str.length()-1; i >= 0 ; i–)
  7. result += str.charAt(i);
  8. return result;
  9. };
  10. System.out.println(“Lambda reversed = ” + reverse.func(“Lambda”));
  11. GenericInterface<Integer> factorial = (n) -> {
  12. int result = 1;
  13. for (int i = 1; i <= n; i++)
  14. result = i * result;
  15. return result;
  16. };
  17. System.out.println(“factorial of 5 = ” + factorial.func(5));
  18. }
  19. }

خروجی

Lambda reversed = adbmaL

factorial of 5 = 120

عبارت لامبدا و جریان API

پکیج جدید java.util.stream به JDK8 اضافه شده است که به برنامه نویسان java اجازه می دهد تا عملیاتی مانند search ، filter ، map ، reduce یا در غیر این صورت دستکاری مجموعه ها مانند لیست ها را انجام دهند.

به عنوان مثال ، یک جریان داده (یک لیست رشته) داریم که در آن هر رشته ترکیبی از نام کشور و محل کشور است. اکنون ، می توانیم این جریان داده را پردازش کنیم و فقط مکان های نپال را بازیابی کنیم.

مثال ۶ : نمایش استفاده از لامبدا با جریان API

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class StreamMain {
  4. static List<String> places = new ArrayList<>();
  5. // preparing our data
  6. public static List getPlaces(){
  7. places.add(“Nepal, Kathmandu”);
  8. places.add(“Nepal, Pokhara”);
  9. places.add(“India, Delhi”);
  10. places.add(“USA, New York”);
  11. places.add(“Africa, Nigeria”);
  12. return places;
  13. }
  14. public static void main( String[] args ) {
  15. List<String> myPlaces = getPlaces();
  16. System.out.println(“Places from Nepal:”);
  17. // Filter places from Nepal
  18. myPlaces.stream()
  19. .filter((p) -> p.startsWith(“Nepal”))
  20. .map((p) -> p.toUpperCase())
  21. .sorted()
  22. .forEach((p) -> System.out.println(p));
  23. }
  24. }

خروجی

Places from Nepal:

NEPAL, KATHMANDU

NEPAL, POKHARA

جریان API به ما امکان دسترسی به متد هایی مانند ()filter() ، map و ()forEach را می دهد که می توانند یک عبارت لامبدا را به عنوان ورودی در نظر بگیرند. ما می توانیم از هر دو متد داخلی جاوا استفاده کنیم و همچنین عبارات خاص خود را بر اساس نحوی که در بالا آموخته ایم تعریف کنیم. این کار باعث می شود خطوط کد را همانطور که در مثال بالا دیدیم به طرز چشمگیری کاهش یابد.

تفاوت پک های حرفه ای ما با آموزشهای رایگان: بطور خلاصه از زمین تا آسمان! 1-پکها، جدیدترین نسخه نرم افزارها را آموزش می دهند با قابلیت های بسیار بیشتر. 2-پکها توسط متخصص آن نرم افزار، به صورت کاملا پروژه محور و با حل چالش هایی که در مسیر کار عملی و حرفه ای با آن روبرو می شوید تهیه شده اند و بعد از استفاده، کاملا برای بازار کار آماده اید! 3- متد این پکها کاملا کار شده و تا ماهها، در ذهن تان ماندگارند و یادگیری بسیار سریعتر و کاملتری خواهید داشت. آموزشهای رایگان فقط دستورات نرم افزارها را (آنهم ناقص) بیان می کنند و تازه برای ورود به بازار باید ماهها تجربه عملی هم کسب کنید !!

turned_in

چرب زبان

با این اپلیکیشن ساده، هر زبانی رو فقط با 5 دقیقه در روز، توی 80 روز مثل بلبل حرف بزن! بهترین متد روز، تقویت حافظه، آموزش تصویری. یادگیری زبان کلید یادگیری هر مهارتی در قرن 21 !


حتما بخوانید!

1 دیدگاه. ارسال دیدگاه جدید

  • مرتضی زمانی
    مرداد 26, 1401 7:10 ق.ظ

    سلام، سه تابع نوشتم که هم در aws آمازون ذخیره شده و هم به صورت ایمج در هاب داکر. و مجموع اونها یک استرینگ و یک الگو از ورودی میگیرند و به عنوان خروجی تعدادی از الگوهای رشته ورودی رو حذف میکنند
    چه جوری میتونم یک زمانبند طراحی کنم که اگر تعداد ورودیها زیر 10 تا بود از داکر و اگر 10 تا یا بیشتر بود از aws استفاده کنه؟

    پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این فیلد را پر کنید
این فیلد را پر کنید
لطفاً یک نشانی ایمیل معتبر بنویسید.

فهرست