دانستنی‌ها

مرتب‌سازی با استفاده از عبارات لامبدا در جاوا ۸

۱- بررسی اجمالی

در این مقاله قصد داریم نگاهی بیندازیم به ویژگی لامبدا (Lambda) در جاوا ۸ و به طور خاص نحوه استفاده از آن در ایجاد یک Comprator جهت مرتب‌سازی یک مجموعه.
ابتدا بیایید یک کلاس entity ساده تعریف کنیم:

۲- مرتب‌سازی پایه بدون استفاده از لامبدا

تا قبل از جاوا ۸، برای مرتب‌سازی یک مجموعه، باید یک کلاس داخلی بی‌نام برای Comprator ایجاد می‌کردیم تا در فرآیند مرتب‌سازی از آن استفاده کنیم:

این Comprator برای مرتب‌سازی لیست نمونه‌های Human به سادگی مورد استفاده قرار می‌گیرد:

۳- مرتب‌سازی پایه با کمک لامبدا

با معرفی لامبداها، می‌توانیم از ایجاد کلاس داخلی بی‌نام صرف نظر کرده و با استفاده‌ از semanticهای تابعی و ساده، به نتایج مشابهی دست یابیم:

هم‌چنین مانند قبل می‌توانیم نتیجه را تست کنیم:

توجه داشته باشید که به جای API قدیمی Collections.sort، از API جدید مرتب‌سازی که به java.util.List در جاوا ۸ اضافه شده استفاده می‌کنیم.

۴- مرتب‌سازی پایه بدون تعریف نوع

می‌توانیم عبارت مرتب‌سازی را با استفاده نکردن از تعریف نوع، باز هم ساده‌تر کنیم. کامپایلر خودش قادر است استنتاج نوع انجام دهد:

و مجددا، می‌توانیم نتیجه را تست کنیم:

۵- مرتب‌سازی با استفاده از «ارجاع به متدهای استاتیک»

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

ابتدا، متد compareByNameThenAge را با امضایی کاملا مشابه با متد compare در شی <Comparator<Human تعریف می‌کنیم:

حالا متد humans.sort را با این ارجاع فراخوانی می‌کنیم:

نتیجه نهایی، مرتب‌سازی یک مجموعه با استفاده از متد استاتیک به عنوان Comparator است.

۶- مرتب‌سازی با استفاده از «ارجاع به متدهای شی»

حتی می‌توانیم با استفاده از ارجاع به متد شی (instance method reference) و متد Comparator.comparing، از تعریف منطق مقایسه هم خودداری کنیم.

از ()getName برای ساخت عبارت لامبدا و مرتب‌سازی لیست بر اساس نام استفاده می‌کنیم:

۷- مرتب‌سازی وارونه

JDK 8 یک متد کمک‌کننده (helper) برای وارونه‌سازی comparator معرفی کرده است. می‌توانیم خیلی سریع با استفاده از آن، مرتب‌سازی وارونه را انجام دهیم:

۸- مرتب‌سازی بر اساس چند شرط مختلف

عبارت‌های لامبدایی لزوما نباید خیلی ساده باشند و می‌توانیم عبارات پیچیده‌تر هم بنویسیم. برای مثال، مرتب‌سازی اشیا ابتدا بر اساس نام و سپس بر اساس سن:

۹- مرتب‌سازی بر اساس چند شرط مختلف – composition

همین منطق، یعنی ابتدا مرتب‌سازی بر اساس نام و سپس بر اساس سن، می‌تواند با کمک composition هم انجام شود.

پس از جاوا ۸، می‌توانیم برای ساخت منطق‌های مقایسه‌ای پیچیده‌تر، چندین comparator را به هم زنجیر کنیم: 

۱۰- مرتب‌سازی یک لیست با استفاده از ()Stream.sorted

هم‌چنین، می‌توانیم یک مجموعه را با استفاده از Stream.sorted() API مرتب کنیم.

می‌توانیم استریم را بر اساس ترتیب طبیعی و یا ترتیبی حاصل از یک Comparator، مرتب کنیم. برای این منظور، دو نوع مختلف overloadشده از sorted() API داریم:

  • ()sorted: آیتم‌های استریم را با ترتیب طبیعی مرتب می‌کند. البته کلاس مربوط به اشیای داخل استریم، باید واسط Comparable را پیاده‌سازی کرده باشد.
  • (sorted(Comparator<? superT> comparator: آیتم‌ها را بر اساس یک نمونه comparator مرتب می‌کند.

یک مثال از نحوه استفاده از متد ()sorted با ترتیب طبیعی ببینیم:

حالا، ببینیم که چطور می‌شود از یک Comparator سفارشی در sorted() API استفاده کرد:

اگر از متد ()Comparator.comparing استفاده کنیم، می‌توانیم مثال بالا را ساده‌تر هم بکنیم:

۱۱- مرتب‌سازی یک لیست به صورت وارونه با استفاده از ()Stream.sorted

هم‌چنین می‌توانیم از ()Stream.sorted برای مرتب‌سازی یک مجموعه به صورت وارونه استفاده کنیم.

ابتدا، بیایید مثالی از نحوه ترکیب متد ()sorted با ()Comparator.reverse برای مرتب‌سازی وارونه یک لیست بر اساس ترتیب طبیعی ببینیم:

حالا، ببینیم که چطور می‌توانیم از متد ()sorted و یک Comparator سفارشی استفاده کنیم:

توجه کنید که compareTo فراخوانی شده است و همین است که کار وارونه‌ کردن مرتب‌سازی را انجام می‌دهد.

نهایتا، بیایید مثال بالا را با استفاده از متد ()Comparator.comparing ساده‌سازی کنیم:

۱۲- جمع‌بندی

در این مقاله، بدون درگیر شدن در پیچیدگی‌های سینتکسی، روش‌های مختلفی که یک لیست با استفاده از عبارات لامبدای جاوا ۸ می‌تواند مرتب شود، با مثال‌های مختلف توضیح داده شد. 

منبع

.

.

.

با ما همراه باشید

آدرس کانال تلگرام: JavaCupIR@

آدرس اکانت توییتر: JavaCupIR@

آدرس صفحه اینستاگرام: javacup.ir

آدرس گروه لینکدین: Iranian Java Developers

نوشته های مشابه

‫۳ دیدگاه ها

    1. سلام
      بهتر و بدتری در این زمینه وجود نداره.
      شما باید با توجه به کاری که قرار هست یا دوست دارید انجام بدید، تصمیم بگیرید که جاوا یاد بگیرید یا php

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

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

دکمه بازگشت به بالا