بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

آموزش: lambda ، قابلیتی فوق العاده در جاوا 8

مدیریت گفتگو
javac 10 سال پیش
آخرین تغییر: 10 سال پیش

جاوا در دهه ی 90 میلادی توسط جیمزگاسلینگ طراحی شد ، زبانی که از همون ابتدا تا به امروز شی گرای محض بود! یعنی برای هرکاری مجبور بودید در قالب کلاس و آبجکت ها با بلاک های کد کار کنید اما در آخرین نسخه از این زبان قدرتمند یعنی جاوا 8 ویژگی های جالبی اضافه شده یکی از این ویژگی ها عبارات لامبدا یا (lambda expression) هست این ویژگی زبان جاوا رو از شی گرایی محض خارج میکنه و اون رو به زبان های تابعی یا (functional programming language) نزدیک میکنه زبان هایی مثل جاوااسکریپت و ...

قبل از توضیح بیشتر لامبدا اول نگاهی میکنیم به  anonymous inner class ها

 btn.setOnClickListener(new OnClickListener(){
@override
public void onClick(View v){
//
}
});

این تکه کد کاملا آشناست.به این ساختار anonymous inner class میگن یعنی کلاس داخلی بی نام

علت نام گذاری: چون داخل متد setOnClickListener ، به عنوان پارامتر ورودی یک اینترفیس رو  درون یک بلاک که اسمی نداره پیاده سازی کردیم ، اون بلاک میشه کلاس ما ، اسمم که نداره ، داخل کلاس اصلیمونم که هست.
و برای انجام این رویداد یعنی رویداد کلیک شدن از این کلاس بی نام یک شی هم ساختیم 

 new OnClickListener(){...}

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

خب لامبدا اومده ما رو از شر anonymous inner class ها خلاص کنه:) ، همون کد رویداد کلیک کردن رو اگر بخوایم با لامبدا بنویسیم میشه این:

 btn.setOnClickListener((View v) -> {
    // do something here
 });

دیگه نیازی به ساخت آبجکت و پیاده سازی متد onClick نیست میبینید که چقدر خلاصه تر ، خوانا تر و سریع هست!

بزارید یک مثال دیگه هم بزنیم:

در جاواهای قبل تر از 8 برای مرتب سازی یک آرایه اینطوری می نوشتیم:

 List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

با استفاده از متد  استاتیک sort  کلاس Collections میتونیم آرایه رو مرتب کنیم ، که پارامتر اول لیست آرایه و پارامتر دوم یک interface و یا همون کلاس بی نام رو میگیره...

همین کد در جاوا 8 و با لامبدا اینطوری نوشته میشه:

 Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
 });

واقعا عالیه ،  از اینم میتونه خلاصه تر بشه:

 Collections.sort(names, (String a, String b) -> b.compareTo(a));

و حتی بیشتر!!:

 Collections.sort(names, (a, b) -> b.compareTo(a));

به طور کلی سینتاکس عبارات لامبدا به این شکل هست:

(parameters) -> body

  1. تعریف نوع داده ی پارامترها اختیاری است
  2. گذاشتن پرانتز اختیاری است
  3. گذاشتن کلمه ی کلیدی return اختیاری است

اما خبر بد اینه که هنوز اندروید از جاوا 8 به طور رسمی پشتیبانی نمیکنه و اما اینجا یک راه غیر رسمی برای پشتیبانی از جاوا 8 در اندروید گفته شده.

کاربردهای لامبدا بسیار گسترده تر از این موردی هست که اشاره شد این مطلب فقط جهت آشنایی و معرفی این ویژگی جالب جاوا 8 بود

نظرات

HoCoder 10 سال پیش
مطلب خوبی بود مرسی
AAA 10 سال پیش
ممنون از وقتی که گذاشتی. خیلی مفید بود...
مسعود فرمانی 10 سال پیش
خیلی سپاس از وقتی که گذاشتید ، بسیار عالی بود
rad 10 سال پیش
متشکر @ javac

هنوز پاسخی ثبت نشده است


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .