بررسی Interface Collection
اولین 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هایی که باید ایجاد کنید را مشخص میکند:- اگر پیادهسازی شما غیرقابل تغییر (Non-modifiable) است، این exception باید
UnsupportedOperationExceptionباشد. - اگر مقادیر null را نمیپذیرد، باید
NullPointerExceptionباشد. - اگر عنصر به دلیل نوع نادرست نمیتواند اضافه شود، باید
ClassCastExceptionایجاد کند. - اگر پیادهسازی شما این عنصر را بر اساس ویژگیهایش رد میکند، باید
IllegalArgumentExceptionایجاد کند.
- اگر پیادهسازی شما غیرقابل تغییر (Non-modifiable) است، این exception باید
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های دیگر را مدیریت میکنند
اولین مجموعه متدهایی که دیدید به شما اجازه مدیریت عناصر منفرد را میدهد. متدهایی هم هستند که Collection دیگری را بهعنوان پارامتر میگیرند.
چهار متد وجود دارد: containsAll()، addAll()، removeAll() و retainAll(). اینها چهار عملیات بنیادی روی مجموعهی اشیاء را تعریف میکنند.
containsAll(): شمول (Inclusion) را تعریف میکند.addAll(): اتحاد (Union) را تعریف میکند.removeAll(): تکمیل (Complement) را تعریف میکند.retainAll(): اشتراک (Intersection) را تعریف میکند.
containsAll() واقعاً ساده است: collection دیگری بهعنوان آرگومان میگیرد و اگر همهی عناصر collection دیگر در این collection موجود باشد true برمیگرداند.
توجه کنید پیادهسازی containsAll() ممکن است در دو حالت Exception ایجاد کند.
- اگر عنصری از collection دیگر با این collection سازگار نباشد، ممکن است
ClassCastExceptionایجاد کند. - اگر عنصری از collection دیگر
nullباشد و این collection عناصر null را نپذیرد، ممکن استNullPointerExceptionایجاد کند. - اگر collection دیگر
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 سر و کار دارند.
دو متد برای بررسی محتوای 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
اگرچه ذخیرهی عناصر در 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 واقعاً ساده است.
فیلتر کردن عناصر یک Collection با Predicate
Java SE 8 یک قابلیت جدید به Interface Collection اضافه کرد: امکان فیلتر کردن عناصر collection با یک Predicate.
فرض کنید List<String> دارید و نیاز دارید تمام رشتههای null، رشتههای خالی و رشتههای بیشتر از ۵ کاراکتر را حذف کنید. با removeIf()، کد شما بسیار سادهتر میشود:
اجرای این کد خروجی زیر را تولید میکند:
strings = [null, , one, two, , three, null]
filtered strings = [one, two, three]
با استفاده از این متد، خوانایی و بیانگری کد اپلیکیشن شما بسیار بهتر میشود.
انتخاب پیادهسازی برای Interface Collection
در تمام این مثالها، از ArrayList برای پیادهسازی Interface Collection استفاده کردیم.
واقعیت این است: Collections Framework پیادهسازی مستقیمی از Interface Collection ارائه نمیدهد. ArrayList List را پیادهسازی میکند و چون List از Collection ارثبری میکند، همچنین Collection را هم پیادهسازی میکند.
اگر تصمیم بگیرید از Interface Collection برای مدلسازی collectionها در اپلیکیشنتان استفاده کنید، انتخاب ArrayList بهعنوان پیادهسازی پیشفرض در بیشتر مواقع بهترین انتخاب شماست. بحثهای بیشتر دربارهی پیادهسازی صحیح را بعداً در این آموزش خواهید دید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات