توابع و اپراتورهایِ Collection در Kotlin - قسمت 1

کلغتِ Collection به معنی "مجموعه" یا "گردآوری شده ها" هست ، سه Collection معروف در جاوا و کاتلین موارد زیر هستن :لیست (List)مجموعه (Set) - به همون معنایی که در ریاضیات خوندید (عضو تکراری ندارد)مپ (Map) - که به صورت Key-Value است ، یک Key به یک Value مپ می‌شوداین عناصر به دو دسته read-only و mutable (تغییر پذیر) تقسیم بندی میشن که البته توابع لازمه برای cast کردنشون به هم وجود داره :از موارد بالا فقط Iterable رو نگفتم که interface ای هست شامل توابع لازم برای پیمایش Collection سازندهیکی از راه های ساخت اشیای بالا استفاده از فرمول name + of هست ، یعنی چه ؟ یعنی شما یک Set میخوای ؟ پس با setOf می‌تونی بسازیش ، یا یک Map به صورت Mutable میخوای ؟ با mutableMapOf می‌سازیش ، به نمونه های زیر دقت کنید : https://gist.github.com/sasssass/4e9f653443f66e540e4266b5346440a5 زمانی که می‌خواید Collection رو از اول و بدون عنصر اولیه بسازید هم به فرمول empty + name این کار رو می‌شه کرد (یا همون فرمول بالا رو بهش ورودی ندید) : https://gist.github.com/sasssass/d927c5786bc9035acff29fd6f81e714f برای لیست یک سازنده به صورت تابعی هم وجود داره ، ورودی اول میشه تعداد عنصر لیست و ورودی دومش تابع سازنده اجزای لیسته : https://gist.github.com/sasssass/677e8dd385b5b9727b24c3bbb1315e63 عملیات Copy و Castفرض کنید یک لیست داریم ، یک لیست دیگر (خالی) هم ایجاد می‌کنیم ، چطور لیست خالی را با لیست اول پر کنیم ؟ یکی از راه ها اپراتور "=" است که این طوری در واقع شما لیست دوم رو با لیست اول برابر قرار میدید ، پس هر تغییری روی یکی از لیست ها منتجر به تغییر روی لیست دیگر میشه پس این راه درست نیست ، با استفاده از فرمول to + name می‌تونید این کار رو بدون حالت بالا انجام بدید : https://gist.github.com/sasssass/b796169bf59922afa991106c1c854711 شمارشابتدایی ترین راهی که برای شمارش یا iterate کردن یک لیست وجود داره استفاده از حلقه for هست که همه بلدن ! ولی راه های حرفه ای تر چیان ؟هم List و هم Set چون از Iterable مشتق شدن قابلیت استفاده از این interface رو دارند که مبنی بر دیزاین پترن هم نامشه : https://gist.github.com/sasssass/2777983086c739d85f6734ff2a6b4b8e نکته جالب اینه که باز هم مثل توابعی که تا الان استفاده می‌کردیم ، می‌تونیم یک iterator خاص درست کنیم که از فرمول name + iterator بدست میاد ، مثال اول نشان دهنده پیماش رو به عقب و دومی نشان دهنده ویرایش در حین پیمایش است : https://gist.github.com/sasssass/771d7ee6b1ab343ee53defaf2ab34663 خروجیعملیات فیلترمسلما بارها پیش اومده که یک لیستی از سرور می‌گیرید و می‌خواید فیلترش کنید ، در کاتلین به راحتی می‌تونیم به این امر برسیم ، مورد اول فیلتر کردن اعداد زوج ، مورد دوم فیلتر کردن اعدادی که زوج نیستند (یا فرد هستند) ، مورد سوم فیلتر کردن اعداد کوچکتر از 4 با این تفاوت که حین عملیات فیلتر به index آنها هم دسترسی داشته باشیم است : https://gist.github.com/sasssass/06bbb6cf79552ff27091bad42eef16bb خروجیدر مورد لیست هایی که انواع متخلفی از داده با رو دارند فیلتری به نام filterIsInstance ، تابع زیر مقادیری که از نوع Int باشند را برمی‌گرداند : https://gist.github.com/sasssass/ed8604029432040ba86c19d32ce396b8 اگر می‌خواید در حین فیلتر کردن لیست ها به دو دسته تقسیم شوند : https://gist.github.com/sasssass/110d05c2f95fca21a7c270aac1a30abd خروجیزمانی هست که نمی‌خواهید خروجی بگیرید ، فقط می‌خواهید بررسی کنید آیا فلان عنصری که بهمان شرط رو داره در لیست ما وجود داره یا نداره ، سه تابع برای این کار هست ، تابع any بررسی می‌کنه آیا در لیست عنصری هست که شرط رو داره یا نه ، تابع all بررسی می‌کنه آیا همه اعضا شرط رو دارند یا نه و تابع none بررسی می‌کنه آیا همه اعضا شرط رو ندارند یا نه : https://gist.github.com/sasssass/9c57318eeccb7ce36eadedc325ad835d گروه بندیبه وسیله تابع groupBy می‌تونید لیست رو به لیست های کوچک تر بشکونید ، خروجی این تابع یک key-value خواهد بود که value لیستِ زیرمجموعه لیست اصلی هست ، به مثال زیر دقت کنید ، در این مثال لیست اعداد یک تا شش را به سه مجموعه افراز می‌کنیم و ملاک ما باقی مانده بر سه است : https://gist.github.com/sasssass/bf296c803361db7b062a50e0e60c2cf0 خروجی کد : {1=[1, 4], 2=[2, 5], 0=[3, 6]}تابع groupBy می‌تواند یک ورودی دوم هم بگیرد ، اگر بخواهید مقدایر را تغییر دهید از این ورودی استفاده می‌شود (هر دو ورودی باید به صورت لامبدا باشند) : https://gist.github.com/sasssass/d42d95c516f640ffc95b9856506ae9ce خروجی کد : {1=[-1, -4], 2=[-2, -5], 0=[-3, -6]}مرتب سازیبرای مرتب سازی می‌توان از تابع sortedBy یا sortedByDescending (برعکس) استفاده کرد ، ورودی این تابع یک لامبدا است که مشخص کننده معیار ما برای مرتب سازی است : https://gist.github.com/sasssass/2c295a0e892dd4494994212c1d57d641 در کد بالا اعداد دو بار مرتب می‌شوند ، بار اول بر اساس مقدار و بار دوم بر اساس اینکه ضریب دو هستند یا نه ، بنابراین خروجی نهایی لیستی است که یک طرف آن اعداد فرد به ترتیب از کوچک به بزرگ و سمت دیگر اعداد زوج به همان منوال است :خروجی : [1, 3, 5, 2, 4, 6, 8, 88]توابع دیگری مانند reversed (برعکس کردن) ، shuffled (رندم) ، asReversed (فرق آن با reversed این است که reversed همیشه List برمی‌گرداند ، یعنی اگر شما MutableList هم داشته باشی باز هم List می‌گیری اما asReversed از همان جنس برمی‌گرداند)در مقالات بعدی به توابع و ویژگی های دیگر از Collection ها می‌پردازیممن رو در لینکدین و اینستاگرام دنبال کنید ???اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???