اولین Interfaceای که باید بشناسید Interface Collection است. این Interface یک collection ساده را مدلسازی میکند که میتواند عناصر را ذخیره کند و روشهای مختلفی برای بازیابی آنها در اختیار شما قرار میدهد.
اگر میخواهید مثالهای این بخش را اجرا کنید، باید بدانید چگونه یک collection بسازید. کلاس ArrayList را هنوز پوشش ندادهایم و بعداً به آن خواهیم پرداخت.
بیایید با ذخیره و حذف یک عنصر از collection شروع کنیم. دو متد درگیر عبارتند از add() و remove().
add(element): یک عنصر به collection اضافه میکند. این متد یک boolean برمیگرداند که اگر عملیات ناموفق بود false است. ناموفق بودن کمی ظریف است، چون وقتی این متد برمیگردد — چه true و چه false — عنصر باید در collection باشد. پس فراخوانی بعدی contains() با این عنصر بهعنوان آرگومان باید true برگرداند. پس اگر پیادهسازی Collection شما تصمیم بگیرد عنصری که قبلاً در Collection نیست را اضافه نکند، باید Exception ایجاد کند. متد add(element) exceptionهایی که باید ایجاد کنید را مشخص میکند:
UnsupportedOperationException باشد.NullPointerException باشد.ClassCastException ایجاد کند.IllegalArgumentException ایجاد کند.remove(element): عنصر مشخصشده را از collection حذف میکند. این متد هم boolean برمیگرداند چون عملیات ممکن است ناموفق باشد. حذف ممکن است ناموفق باشد مثلاً وقتی آیتم درخواستشده برای حذف در collection وجود نداشته باشد.میتوانید مثال زیر را اجرا کنید. در اینجا، نمونهای از Interface Collection با استفاده از پیادهسازی ArrayList ایجاد میکنید. Genericهای استفادهشده به کامپایلر جاوا میگویند که میخواهید اشیاء String را در این collection ذخیره کنید. ArrayList تنها پیادهسازی Collection نیست که میتوانید استفاده کنید. بعداً بیشتر خواهید دید.
اجرای کد قبلی باید خروجی زیر را چاپ کند:
strings = [one, two]
strings = [two]
میتوانید وجود یک عنصر در collection را با متد contains() بررسی کنید. توجه کنید میتوانید وجود هر نوع عنصری را بررسی کنید. مثلاً بررسی وجود یک شیء User در collection از نوع String معتبر است. این شاید عجیب به نظر برسد، چون هیچ شانسی نیست این بررسی true برگرداند، اما توسط کامپایلر مجاز است.
اجرای این کد خروجی زیر را تولید میکند:
one is here
three is not here
Rebecca is not here
اولین مجموعه متدهایی که دیدید به شما اجازه مدیریت عناصر منفرد را میدهد. متدهایی هم هستند که Collection دیگری را بهعنوان پارامتر میگیرند.
چهار متد وجود دارد: containsAll()، addAll()، removeAll() و retainAll(). اینها چهار عملیات بنیادی روی مجموعهی اشیاء را تعریف میکنند.
containsAll(): شمول (Inclusion) را تعریف میکند.addAll(): اتحاد (Union) را تعریف میکند.removeAll(): تکمیل (Complement) را تعریف میکند.retainAll(): اشتراک (Intersection) را تعریف میکند.containsAll() واقعاً ساده است: collection دیگری بهعنوان آرگومان میگیرد و اگر همهی عناصر collection دیگر در این collection موجود باشد true برمیگرداند.
توجه کنید پیادهسازی containsAll() ممکن است در دو حالت Exception ایجاد کند.
ClassCastException ایجاد کند.null باشد و این collection عناصر null را نپذیرد، ممکن است NullPointerException ایجاد کند.null باشد هم ممکن است NullPointerException ایجاد کند.مثالی از استفاده از این متد:
اجرای این کد خروجی زیر را تولید میکند:
Is first contained in strings? true
Is second contained in strings? false
دومی addAll() است. اجازه میدهد همهی عناصر یک collection مشخص را به این collection اضافه کنید. این متد اگر این collection توسط این فراخوانی تغییر کرده باشد true برمیگرداند. نکتهی مهم: دریافت مقدار true به این معنا نیست که همهی عناصر collection دیگر اضافه شدهاند؛ به این معناست که حداقل یکی اضافه شده.
اجرای این کد خروجی زیر را تولید میکند:
Has strings changed? true
strings = [one, two, three, one, four]
باید بدانید اجرای این کد اگر پیادهسازی Collection را تغییر دهید خروجی متفاوتی تولید میکند. این نتیجه برای ArrayList است، اما همانطور که در مثال بعدی میبینید برای HashSet یکسان نیست.
اجرای این کد خروجی زیر را تولید میکند:
Has strings changed? false
strings = [four, one, two, three]
سومی removeAll() است. تمام عناصر این collection که در collection دیگر موجود هستند را حذف میکند.
اجرای این کد خروجی زیر را تولید میکند:
Has strings changed? true
strings = [two, three]
آخری retainAll() است. این عملیات فقط عناصری از این collection را نگه میدارد که در collection دیگر موجود هستند؛ بقیه حذف میشوند.
اجرای این کد خروجی زیر را تولید میکند:
Has strings changed? true
strings = [one]
آخرین دسته متدها با خود collection سر و کار دارند.
دو متد برای بررسی محتوای collection دارید.
size(): تعداد عناصر در collection را بهصورت int برمیگرداند.isEmpty(): به شما میگوید collection دادهشده خالی هست یا نه.اجرای این کد خروجی زیر را تولید میکند:
Indeed strings is not empty
The number of elements in strings is 2
سپس میتوانید محتوای collection را با فراخوانی clear() پاک کنید.
اجرای این کد خروجی زیر را تولید میکند:
The number of elements in strings is 2
After clearing it, this number is now 0
اگرچه ذخیرهی عناصر در collection ممکن است در اپلیکیشن شما منطقیتر از قرار دادن آنها در array باشد، باز هم مواردی وجود دارد که دریافت آنها بهصورت array لازم است.
Interface Collection سه الگو برای دریافت عناصر collection بهصورت array ارائه میدهد، به شکل سه نسخهی Overload متد toArray().
اولی فراخوانی سادهی toArray() بدون آرگومان است. عناصر شما را در آرایهای از اشیاء ساده برمیگرداند.
این ممکن است آنچه نیاز دارید نباشد. اگر Collection<String> دارید، ترجیح شما ممکن است آرایهای از String باشد. هنوز میتوانید Object[] را به String[] Cast کنید، اما تضمینی وجود ندارد که این Cast در Runtime ناموفق نشود. اگر نوعامنی (Type Safety) نیاز دارید، میتوانید از هر یک از متدهای زیر استفاده کنید.
toArray(T[] a) آرایهای از T برمیگرداند: T[].toArray(IntFunction<T[]> generator) همان نوع را با سینتکس متفاوت برمیگرداند.تفاوت دو الگوی آخر چیست؟ اولی خوانایی است. ایجاد نمونهای از IntFunction<T[]> در نگاه اول شاید عجیب به نظر برسد، اما نوشتن آن با Method Reference واقعاً ساده است.
Java SE 8 یک قابلیت جدید به Interface Collection اضافه کرد: امکان فیلتر کردن عناصر collection با یک Predicate.
فرض کنید List<String> دارید و نیاز دارید تمام رشتههای null، رشتههای خالی و رشتههای بیشتر از ۵ کاراکتر را حذف کنید. با removeIf()، کد شما بسیار سادهتر میشود:
اجرای این کد خروجی زیر را تولید میکند:
strings = [null, , one, two, , three, null]
filtered strings = [one, two, three]
با استفاده از این متد، خوانایی و بیانگری کد اپلیکیشن شما بسیار بهتر میشود.
در تمام این مثالها، از ArrayList برای پیادهسازی Interface Collection استفاده کردیم.
واقعیت این است: Collections Framework پیادهسازی مستقیمی از Interface Collection ارائه نمیدهد. ArrayList List را پیادهسازی میکند و چون List از Collection ارثبری میکند، همچنین Collection را هم پیادهسازی میکند.
اگر تصمیم بگیرید از Interface Collection برای مدلسازی collectionها در اپلیکیشنتان استفاده کنید، انتخاب ArrayList بهعنوان پیادهسازی پیشفرض در بیشتر مواقع بهترین انتخاب شماست. بحثهای بیشتر دربارهی پیادهسازی صحیح را بعداً در این آموزش خواهید دید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/