3- کاتلین از ابتدا : Ranges (محدوده‌ها) و Collections (مجموعه‌ها)

توی قسمت قبلی از این سری ما در مورد nuallability، حلقه‌ها و دستورات شرطی کاتلین بحث کردیم. توی این قسمت، آموزش رو با مروری بر ranges و collections API در کاتلین ادامه خواهیم داد.

1-محدوده‌ها (Ranges)

یک range یا محدوده توی کاتلین یک نوع داده‌ی یونیک هستش که یک مقدار آغازین و یک مقدار پایانی براش تعریف شده. به عبارت دیگه، یک فاصله‌ای هست بین یک مقدار آغازین و یک مقدار پایانی ، و range به این فاصله گفته میشه.و یه نکته‌ی دیگه اینکه وقتی گفته میشه که rangeها بسته هستن یعنی توسط نقطه‌ی آغازین و پایانی که گفتم احاطه شدن.

خب حالا یه نگاهی به روش‌های مختلف ساخت range توی کاتلین میندازیم.

عملگر ..

https://gist.github.com/sajjadyousefnia/01a3ff4dac902be731b285205949ca2f

توی کد بالا، ما یک محدوده‌ی بسته رو درست کردیم. متغییر oneToFive شامل مقادیر 1 تا 5 خواهد بود. ما می‌تونیم از طریق حلقه‌ی loop کل اعداد رو داشته باشیم.

https://gist.github.com/sajjadyousefnia/216549c357963d0ecbc143aee1fba47b

که کد بالا رو میشه کوتاه‌تر هم کرد:

https://gist.github.com/sajjadyousefnia/ce9bb9bfd1a430ad09f1a2545dfbba99

همینطور ما می‌تونیم یک محدوده‌ای از کارکترها رو ایجاد کنیم:

https://gist.github.com/sajjadyousefnia/965940bb00eae726ac3140a4b823a7ff

متغییر aToZ همه‌‌ی حروف زبان انگلیسی رو خواهد داشت.

تابع ()rangeTo

به جای عملگر .. میشه از عملگر ()rangeTo برای ساخت یک محدوده استفاده کرد. برای مثال، همینطور ما می‌تونیم اینجوری استفاده کنیم :

1.rangeTo(5)

که نتیجش با .. یکیه، که بعدا در موردش بیشتر بحث می‌کنیم.

https://gist.github.com/sajjadyousefnia/971aa2b44e16237c9f8f6e7aeabfdf9f

تابع ()downTo

اینم یک تابع اکستنشنی یا همون function extension هست که محدوده‌ای رو از یک عدد بیشتر داده شده تا عدد کمتری که داده شده می‌سازه.

https://gist.github.com/sajjadyousefnia/6312e2042f64358447017d89a04a67c7

ما می‌تونیم محدوده رو با استفاده از تابع ()step اصلاح کنیم. با ابن کار می‌تونیم اختلاف بازه‌ای بین هر دو مقدار پشت سر هم رو تغییر بدیم.

https://gist.github.com/sajjadyousefnia/076bbb4cadd515764c9d736ce18e49e1

کد بالایی شامل اعداد 1 تا 10 هست.

عملگر in

این عملگر برای مشخص کردن این که آیا یک مقداری در یک range هست یا نه، نیز به کار می‌رود.

https://gist.github.com/sajjadyousefnia/52066b5b76f622ef02fffde81cbad720

توی کد بالایی ما با استفاده از عملگر in چک کردیم که آیا عدد 5 در محدوده‌ی 1 تا 10 هست یا نه؟ برعکس همین کارو می‌تونیم با استفاده از n! انجام بدیم در صورتی که عدد 5 در محدوده نباشه.

2- مجموعه ها ( Collections )

برای ذخیره کردن مجموعه‌ای از آبجکت‌‌ها داخل حافظه استفاده میشه. توی یک collection ما می‌تونیم آبجکت‌ها رو ذخیره، دریافت و سازماندهی کنیم. Collections  API توی جاوا به عنوان یک کتابخونه‌ی استاندارد ارائه شده که براساس APIی Java Collections ساخته شده. ( ما توی قسمت بعدی در مورد اینترفیس‌ها توی کاتلین بحث خواهیم کرد )

شما بایستی توجه کنید که این اینترفیس‌ها زمان کامپایل به implemenetهاشون لینک یا همون متصل میشن. به دلیل اینکه در واقع Collectionها توسط کالکشن های استاندارد جاوا، مثل ArrayList و Maps و Hashmap و Sets و HashSet و List و غیره Implement میشن، نمی‌تونیم سورس کد Implement شدنشون رو ببینید. برای درک بهتر Collections API در کاتلین، احتیاج به آشنایی با مفاهیم پایه و اینترفیس‌ها در جاوا دارید.

توی این بخش شما مطالبی رو در مورد کالکشن‌های List و Set و Map در کاتلین یاد می‌گیرید.

درست برعکس جاوا، به وسیله‌ی کالکشن‌های کاتلین ما می‌تونیم با کمی کد، کارهای زیادی رو انجام بدیم!

کاتلین دو نوع کالکشن داره : 1- mutable یا تغییرپذیر 2- immutable یا غیر قابل تغییر. در یک کالکشن تغییرپذیر ما می ‌تونیم یک کالکشن رو از طریق اضافه ، حذف یا جایگزین کردن، اصلاح کنیم. کالکشن‌های غیرقابل‌تغییر رو نمیشه از طریق متدهای کمکی تغییر داد.

یک نکته‌ی دیگه‌ای رو هم یادتون باشه که، حذف یا جایگزینی یا اضافه کردن یک درایه توی یک کالکشن تغییرپذیر از تغییر توابع عملگر هم امکان‌پذیره ( که به طور خلاصه‌وار بررسی خواهیم کرد )، ولی باعث میشه که یک کالکشن جدید ساخته بشه.

اینترفیس Iterable

  • توی کاتلین اینترفیس‌های Iterable روی بالاترین قسمت و نوک سلسله مراتب ارث‌بری کلاس‌های کالکشن‌ها قرار داره. این اینترفیس باعث میشه که کالکشن‌ها بتونن به شکل دنباله‌ای از درایه‌ها قرار بگیرن ( که طبیعتا قابل iterate کردن یا همون تکرار پذیری رو هم دارن)
https://gist.github.com/sajjadyousefnia/b6fb28a4fb61f462829850116c64cc23

اینترفیس Collection

اینترفیس Collection از اینترفیس Iterable ارث می‌بره. اینترفیس Collection غیرقابل تغییره. به عبارت دیگه، از لحاظ دسترسی، فقط می‌تونید اونا رو بخونید. توی کاتلین اینترفیس‌های Set و List از این اینترفیس ارث‌بری می‌کنن.

بعضی از توابع و propertyهایی که توی اینترفیس Collection قابل دسترسی هستند:

  • ا size : این property اندازه‌ی کالکشن رو return می‌کنه.
  • ا isEmpty : در صورتی که کالکشن خالی باشه true رو return می‌کنه، در غیر این صورت false رو return می‌کنه.
  • ا (contains(element : E : در صورتی که آرگومان مورد نظر توی کالکشن موجود باشه، true رو return می‌کنه.
  • ا (<containsAll (element: Collection<E : ما یک کالکشن رو به عنوان آرگومان می‌فرستیم، حالا تابع چک می‌کنه که آیا کالکشن اصلی شامل اینی که فرستادیم هست یا نه؟ اگه بود که true رو return میکنه، یا به قولی چک می‌کنه که آیا کالکشنی که به عنوان آرگومان فرستادیم زیرمجموعه‌ای از کالکشن اصلی هست یا خیر.
https://gist.github.com/sajjadyousefnia/ca40c05af6e6ba345b171cd145201566

اینترفیس MutableIterable

این اینترفیس به ما یک iterator تغییرپذیر که از اینترفیس Iterable ارث‌بری داره، رو به ما میده.

https://gist.github.com/sajjadyousefnia/7a83d17b2342cd663e468821fb068e2b

اینترفیس MutableCollection

توی کاتلین اینترفیس MutableCollection یک اینترفیس تعمیم‌یافته هست که می‌تونیم کالکشن‌های تغییرپذیرش رو استفاده کنیم.به عبارت دیگه، علمیات حذف و اضافه کردنو میشه روی این کالکشن‌ها انجام داد. این اینترفیس هم از اینترفیس Collection و هم از اینترفیس MutableIterable ارث‌بری داره. همینطور اینترفیس‌های MutableSet و MutableList ( که به صورت کوتاه بررسی‌شون خواهیم کرد ) از این اینترفیس ارث‌بری دارن. جدا از اون توابعی که مال پرنت اون اینترفیس، توی ارث‌بری هستند، توابعی که مال خود این اینترفیس هستن، به صورت زیرن:

  • ا (add(element: E : درایه‌ای رو که به عنوان آرگومان فرستاده شده رو به کالکشن اضافه ‌می‌کنه بعدش اگه عملیات موفقیت‌آمیز true رو return می‌کنه و اگه درایه تکراری باشه و کالکشن نتونه درایه‌ی تکراری رو اضافه کنه، false رو return می‌کنه.
  • ا (remove(element: E : درایه‌ای رو که به عنوان آرگومان فرستاده شده رو، از لیست حذف ‌میکنه. اگه عملیات حذف موفقیت آمیز باشه true رو return می‌کنه و در صورتی که همچین درایه‌ای وجود نداشته باشه، false رو return می‌کنه.
  • ا (<addAll(elements: Collection<E: همه‌ی درایه‌های کالکشنی رو که به عنوان آرگومان فرستاده شده رو به کالکشن اصلی اضافه می‌کنه. در صورتی که عملیات موفقیت‌آمیز باشه true رو return می‌کنه، در غیر این صورت اگه هیچی اضافه نشه، false رو return می‌کنه.
  • ا (<removeAll(elements: Collection<E : همه‌ی درایه‌های کالکشنی رو که به عنوان آرگومان فرستاده شده رو از کالکشن اصلی حذف می‌کنه. در صورتی که عملیات موفقیت‌آمیز باشه true رو return می‌کنه، در غیر این صورت اگه هیچی حذف نشه، false رو return می‌کنه.
  • ا (<retainAll(elements: Collection<E : فقط درایه‌های کالکشنی رو که به عنوان آرگومان فرستاده شده رو توی کالکشن اصلی نگه می‌داره. در صورتی که عملیات موفقیت‌آمیز باشه true رو return می‌کنه، در غیر این‌صورت اگه هیچی نگه داشته نشه، false رو return می‌کنه.
  • ا ()clear : همه‌ی درایه‌های کالکشن رو حذف می‌کنه.
https://gist.github.com/sajjadyousefnia/4877b0a2d4a5232d1aaa0d70079c2675

تا حالا ما مطالبی رو در مورد اینترفیس‌هایی که توی بالاترین قسمت و نوک سلسله مراتب ارث‌بری قرار دارن، رو یاد گرفتیم، حالا از اینجا تا آخر این قسمت نگاهی به این مطلب میندازیم که کاتلین چجوری کالکشن‌هایی مثل Lists و Sets و Maps رو مدیریت و استفاده می‌کنه.

ا Lists

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

استفاده از تابع ()listOf

توی کاتلین، با استفاده از تابع کمکی ()listOf از کتابخونه‌ی استاندارد کاتلین، می‌تونیم یک لیست تغییرناپذیر ( فقط قابل خوندن ) ایجاد کنیم. این تابع یک اینترفیس از نوع List رو return می‌کنه.

https://gist.github.com/sajjadyousefnia/90b5a4c7743424c2c04407d8771965fe

با اجرای کد بالایی نتیجه‌ی زیر چاپ میشه :

https://gist.github.com/sajjadyousefnia/b89613067c25c417dac742786016a199

علاوه بر این، می‌تونیم مقدارهایی که نوع متفاوتی رو دارن رو بدون هیچ مشکلی به عنوان آرگومان به ()listOf بفرستیم. در این صورت یک لیست از نوع میکس‌شده یا همون ترکیبی خواهیم داشت.

https://gist.github.com/sajjadyousefnia/2e9ebe878fa829dd322a98a41a5ce81a

استفاده از تابع emptyList

این تابع صرفا یک لیست خالی تغییرناپذیر رو درست می‌کنه و یک اینترفیس از نوع List رو return می‌کنه.

https://gist.github.com/sajjadyousefnia/fe7a910f7af7010f563298fe1b67e36d

استفاده از تابع ()listOfNotNull

این تابع یک لیست تغییرناپذیر درست می‌کنه که درایه‌هاش اصلا null یا همون تهی نیستن. همینطور یادتون باشه که این تابع یک اینترفیس از نوع List رو return می‌کنه.

https://gist.github.com/sajjadyousefnia/81205e2df0ce640c1c36aa953675d8a2

اینترفیس List که مال کتابخونه‌ی استاندارد کاتلین هست فقط از اینترفیس Collection ارث‌بری داره. یا به قولی، تنها پدر یا همون پرنت اون اینترفیس Collection هست. برای رفع نیازهای ضروری همه‌ی تابع‌های اینترفیس پدر رو override می‌کنه، در کنار این کار خودش هم چند تا تابع تعریف می‌کنه :

  • ا (get(index: Int : یک عملگری هست که براساس ایندکس یا همون اندیسی که بهش میگیم یک درایه رو return می‌کنه.
  • ا (indexOf(element: E : براساس آرگومانی که بهش میدیم، از اول شروع به جستجو میکنه و اندیس اولین درایه از لیست که مقدارش با اون یکی بود رو return می‌کنه، چنانچه نتونست درایه‌ای برابر با آرگومان پیدا کنه، مقدار 1- رو return می‌کنه.
  • ا (lastIndexOf(element: E : وقتی که یک آرگومانی رو بهش میدیم، اندیس آخرین درایه‌ای رو که مقدارش برابر با آرگومان ما باشه رو return می‌کنه، یعنی میشه گفت یه جورایی برعکس قبلیه.
  • ا ()listIterator : یک list iterator رو می‌سازه و return می‌کنه که همه‌ی درایه‌های لیست موجود داخلش هستن.
  • ا (subList(fromIndex: Int, toIndex: Int : یک لیستی رو می‌سازه و برمی‌گردونه که اندیس شروع و پایانش از لیست اصلی، اون جاهایی که ما مشخص کردیم هست.
https://gist.github.com/sajjadyousefnia/5716edcd8b5e8b59ca4b603f1d7b8f65

استفاده از تابع ()arrayListOf

یک لیست تغییرپذیر می‌سازه و دقیقا از نوع همون ArrayListهای توی جاوا به ما برمیگردونه.

https://gist.github.com/sajjadyousefnia/58de50da51daca931c2a6810b57c6108

استفاده از تابع ()mutableListOf

برای اضافه، حذف، یا جایگزینی یک مقدار توی لیست، اول لازمه که تغییرپذیر بشه. ما یک لیست تغییرناپذیر رو با استفاده از تابع ()toMutableList ، تغییرپذیرش می‌کنیم. اما، یادتون باشه که این متد یک لیست جدیدی رو می‌سازه.

https://gist.github.com/sajjadyousefnia/b3e2516d3b5defbf4a9f3128ce3dccd1

برای اینکه بخوایم از ابتدا یک لیست تغییرپذیری رو بسازیم که از جنس خاصی باشه مثلا، String باشه، از ()<mutableListOf<String استفاده می‌کنیم ، در صورتی که بخوایم ترکیبی از چند نوع داده داشته باشیم، باید از تابع ()mutableListOf استفاده کنیم.

https://gist.github.com/sajjadyousefnia/cee101469326b81d5e22d1992808f8bb

هر کدوم از این توابع این توابع یک اینترفیس از نوع MutableList رو return می‌کنن. این اینترفیس این اینترفیس هم از اینترفیس MutableCollection و هم از اینترفیس List که قبلا در موردشون صحبت کردیم ارث می‌بره. MutableList خودش متدهایی رو برای حذف، اضافه و جایگزین کردن براساس اندیس درایه‌ها داره :

  • ا (set(index: Int, element: E : جای یک درایه‌ی داخل لیست رو با یک درایه‌ی دیگه عوض می‌کنه. در عوض درایه‌ای رو که قبلا توی اون اندیس مشخص شده قرار داشته رو return می‌کنه.
  • ا ( add(index: Int, element: E : یک درایه رو توی اندیسی که ما بهش میدیم میگذاره.
  • ا (removeAt(index: Int : اون درایه‌ای رو که توی اندیسی که ما بهش میدیم قرار داره رو حذف می‌کنه.
https://gist.github.com/sajjadyousefnia/8831bb889e7713b176c3d47d7f790e4a

با اجرای کد بالایی ، نتیجه‌ی پایینی چاپ میشه:

https://gist.github.com/sajjadyousefnia/d729af315d770d72b7e816a7192788ba

یادتون باشه که در واقع همه‌ی این توابع در واقع یک ArrayList جاوایی رو می‌سازن.

ا Sets

یک Set یا همون مجموعه یک کالکشنی از درایه‌های مرتب نشده‌ی یونیک هست. به عبارت دیگه، نمی‌تونیم درایه‌ی تکراری داشته باشیم. ما چند تا روش مختلف برای ساخت یک set توی کاتلین داریم، که هر کدومشون برای یک نوع وظیفه‎ای بهینه‌سازی شدن.

استفاده از تابع ()setOf

توی کاتلین، برای ایجاد یک ستِ ( فقط قابل خواندن )، می‌تونیم از تابع ()setOf استفاده کنیم، که یک اینترفیس از نوع Set رو return می‌کنه.

https://gist.github.com/sajjadyousefnia/3e99a578f6971c473918cec14e3c69f1

فقط اینکه توی کاتلین، اینترفیس Set فقط از اینترفیس Collection ارث‌بری داره و همه‌ی propertyهاش رو override می‌کنه.

استفاده از تابع ()hashSetOf

با استفاده از تابع ()hashSetOf میشه یک HashSet Collection رو ایجاد کرد، که درایه‌ها رو توی یک جدول هشی ( جدول درهم‌سازی ) ذخیره کرد. این تابع جنس داده‌ی HashSet رو return می‌کنه. به همین خاطر می‌تونیم علمیات حذف و اضافه کردن درایه‌ها رو داخلش انجام داد. بدیهیه که تغییر پذیر هم هست.

https://gist.github.com/sajjadyousefnia/103ee97c2ef961e1cce6f3d23bbdd9cb

استفاده از تابع ()sortSetOf

درحقیقت با استفاده از تابع ()sortedSetOf میشه یک TreeSet Collection رو درست کرد که تغییرپذیر هم هست. و درایه‌ها رو براساس ترتیب طبیعی یا به وسیله‌ی یک مقایسه کننده مرتب می‌کنه.

https://gist.github.com/sajjadyousefnia/bab2354ea39e5e522d3061bae0135e0c

استفاده از تابع ()linkedSetOf

این تابع داده‌ای از جنس LinkedHashSet رو return می‌کنه. و داده‌هایی رو که وارد این ست میشن به ترتیب وارد شدن به شکل لیست پیوندی نگه‌داری میشن.

https://gist.github.com/sajjadyousefnia/59cc45122180a3826628a3e5f890a59b

استفاده از تابع ()mutableSetOf

ما از ()mutableSetOf برای ساخت یک لیست تغییرپذیر استفاده می‌کنیم. چیزی که این تابع return می‌کنه از نوع اینترفیس MutableSet هست. در حقیقت، این تابع به راحتی می‌تونه یک LinkedHashSet رو ایجاد کنه.

https://gist.github.com/sajjadyousefnia/ca8d35f79500e0a1481146b763d36811

اینترفیس MutableSet هم از MutableCollection و هم از اینترفیس‌های Set ارث‌بری داره.

ه Maps

ه Maps حاصل پیوند کلیدها ( Keys ) به مقادیر ( values ) هست. کلیدها بایستی که حتما یونیک باشند، ولی برای مقادیر همچین قضیه‌ای نیست. در واقع برای پیاده‌سازی و اجرای اون از Maps Collection هایی که توی جاوا وجود داره، استفاده می‌کنیم.

استفاده از تابع ()mapOf

برای ایجاد یک Map Collection غیرقابل تغییر یا قابل خوندن از تابع ()mapOf استفاده می‌کنیم. ما یک map رو با استفاده از تابعی که گفتیم و به صورت لیست دوتایی استفاده می‌کنیم که اولی کلید و دومی مقدار آن کلید هست. با فراخوانی این تابع یک اینترفیس از نوع Map رو میشه return کرد.

https://gist.github.com/sajjadyousefnia/c6992956f7cafae82552ff6881c05acc

با اجرای کد بالایی به نتیجه‌ی زیر می‌رسیم :

https://gist.github.com/sajjadyousefnia/4a5dbbbc4c0e22c1788f5e87bf33da37

توی کاتلین، برخلاف List و Set که از اینترفیس Collection ارث‌بری دارن، اینترفیس Map از جایی اصلا ارث‌بری نداره. چند تا از propertyها و توابعی رو که توی این اینترفیس میشه استفاده کرد رو پایین می‌بینید:

  • ه size : این property اندازه‌ی map collection رو return می‌کنه.
  • ه isEmpty :در صورتی که map خالی باشه true رو return می‌کنه، در غیر این‌صورت false رو return می‌کنه.
  • ه ( containsKey(key: K : در صورتی که کلیدی برابر با آرگومان پیدا بشه، true رو return می‌کنه.
  • ه ( containsKey(value: V : در صورتی که مقداری برابر با آرگومان پیدا بشه، true رو return می‌کنه.
  • ه ( get(key: K: مقداری رو که با کلید داده شده مطابقت داره رو return می‌کنه، در صورتی که مقداری رو پیدا نکنه، null رو return می‌کنه.
  • ه keys : این proprty یک set از همه‌ی کلیدها رو که تغییرناپذیر هم هست، return می‌کنه.
  • ه values : یک Collection تغییرناپذیر از همه‌ی مقادیر داخل map رو return می‌کنه.

استفاده از تابع ()mutableMapOf

تابع ()mutableMapOf برای ما یک map تغییرپذیر ایجاد می‌کنه، در نتیجه ما می‌تونیم درایه‌ها رو توی این map اضافه یا حذف کنیم. این تابع یک اینترفیس از نوع MutableMap رو return می‌کنه.

https://gist.github.com/sajjadyousefnia/fbe965e1bc7fcc6fde06304ae28838e5

اینترفیس MutableList از اینترفیس MutableCollection ارث‌بری نداره و تنها پدر اون اینترفیس Map هست. اون propertyهای keys، entries و values رو از اینترفیس پدر override می‌کنه تا اونا رو مجددا تعریف کنه. پایین می‌تونید چند تا از تابعی که توی اینترفیس MutableList قابل دسترس هستن رو ببینید :

  • ه (put(key: K, value: V : یک جفتی از کلید و مقدار رو وارد map می‌کنه. و اینکه مقدار قبلی‌ای که با این کلید ست شده رو return می‌کنه و در صورتی که قبلا همچین کلیدی نداشتیم، null رو return می‌کنه.
  • ه (remove(key: K : کلید مورد نظر و همچنین مقداری رو که باهاش ست شده رو حذف می‌کنه.
  • ه (<putAll (from: Map<out K, V : این تابع map رو با استفاده از همه‌ی داده‌هایی که در map داده شده وجود داره، آپدیت می‌کنه. علاوه بر این که کلیدهای جدیدی اضافه میشن، کلیدهای تکراری با مقدار های جدید آپدیت میشن.
  • ه ()clear : همه‌ی درایه‌های موجود داخل map رو حذف می‌کنه.

می‌تونیم مقدار یک کلید رو با استفاده از تابع ()get بدست بیاریم. در ضمن می‌تونیم از براکت به عنوان جایگزین ()get استفاده کنیم.

https://gist.github.com/sajjadyousefnia/cbce0d56b896cd889cc8c6d99ecb3565

استفاده از تابع ()hashMapOf

این تابع داده‌ای از نوع HashMap رو return می‌کنه که تغییرپذیر هم هست. کلاس HashMap از یک جدول هشی برای implement کردن اینترفیس Map استفاده می‌کنه.

https://gist.github.com/sajjadyousefnia/0b8351bfd3db2e303ffcc3252ed69bff

استفاده از تابع ()linkedHashMap

این تابع داده‌ای از نوع LinkedHashMap رو return می‌کنه که تغییرپذیر هست. کلاس LinkedHashMap از HashMap جاوا ارث می‌بره و یک لیست پیوندی از داده‌هایی که وارد map می‌شن رو به ترتیب وارد شدنشون نگه می‌داره.

https://gist.github.com/sajjadyousefnia/1b284104e90d84844aba3fd13632539d

استفاده از تابع ()sortedMapOf

این تابع یک داده از جنس SortedMap جاوا return می‌کنه که تغییرپذیر هم هست. داخل کلاس SortedMap همه‌ی درایه‌های ورودی براساس کلیدها به صورت صعودی مرتب میشن.

https://gist.github.com/sajjadyousefnia/17cdc7897bcaf38c1fea7b06ccc2e0ae

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

توابع عملیاتی کالکشن‎ها

کاتلین extension functionهای مفید زیادی رو به ما میده که توی کالکشن‌ها قابل فراخوانی هستن. حالا بیایید نگاهی به چند تا از مفیدترین توابع بندازیم.

تابع ()last

این تابع عملگر آخرین درایه‌ی داخل یک کالکشن که می‌تونه شامل یک list یا یک set باشه رو return می‌کنه. همچنین می‌تونیم براش یه شرطی تعیین کنیم که از اون استفاده کنه برای پیدا کردن آخرین درایه‌ای که شرط ما رو داره. حالا به همین شرطی که قرار میدیم predicate گفته میشه.

https://gist.github.com/sajjadyousefnia/daa8607208a1326d2b37a5f9f3809a74

تابع ()first

این عملگر نخستین درایه‌ی داخل list یا set رو فراخوانی می‌کنه. اگه شرط یا همون predicateای که گفتیم رو داشته باشه، می‌تونه از اون برای محدود کردن جستجوی خودش استفاده کنه.

https://gist.github.com/sajjadyousefnia/c2b141c1afd431bc1ba8606437971098

تابع ()max

با فراخوانی این تابع عملگر داخل یک کالکشن اعم از list یا set میشه بزرگترین درایه رو return کرد، اگر هم بزرگترین درایه پیدا نشه مقدار null رو reutrn می‌کنه.

https://gist.github.com/sajjadyousefnia/b76ac20fb06264550403d759cf8ba199

تابع ()drop

با فراخوانی این تابع یک list رو میشه return کرد که همه‌ی درایه‌ها به جز نخستین n عنصر اول ( که n رو ما بهش میدیم ) رو return می‌کنه.

https://gist.github.com/sajjadyousefnia/15eb589ddfbba8c3095256090805b0b4

تابع ()plus

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

https://gist.github.com/sajjadyousefnia/8090a3575ad2ba7e7f4a31f1e2539ce3

تابع ()minus

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

https://gist.github.com/sajjadyousefnia/6f2e268e27245abc9ebbda4caef63f7c

تابع ()average

با فراخوانی این تابع میشه عدد میانگین درایه‌های داخل کالکشن رو return کرد.

https://gist.github.com/sajjadyousefnia/9cb625df961dfb0e365790ea3f490d88

بیشتر این extension function ها داخل کتابخونه‌ی استاندارد کالشکن‌های کاتلین قابل دسترس هستن.

نتیجه گیری

توی این قسمت ما با مطالبی رو در مورد range و collection API کاتلین آشنا شدیم. توی قسمت بعدی ما توابع کاتلین رو معرفی خواهیم کرد.