میتوانید بهسادگی با put(key, value) یک جفت کلید-مقدار به نقشه اضافه کنید. اگر کلید قبلاً در نقشه وجود نداشته باشد، جفت کلید-مقدار اضافه میشود. اگر وجود داشته باشد، مقدار موجود با مقدار جدید جایگزین میشود.
در هر دو حالت، متد put() مقداری که قبلاً به کلید متصل بود را برمیگرداند. یعنی اگر کلید جدید باشد، فراخوانی put() مقدار null برمیگرداند.
Java SE 8 متد putIfAbsent() را معرفی کرد. این متد هم جفت کلید-مقدار را فقط در صورتی اضافه میکند که کلید قبلاً وجود نداشته باشد و به مقدار null متصل نباشد. ممکن است در نگاه اول گیجکننده به نظر برسد، اما putIfAbsent() مقدار null را با مقدار جدید ارسالی جایگزین میکند.
این متد هنگام نیاز به حذف مقادیر null معیوب از نقشه بسیار مفید است. مثلاً کد زیر با خطای NullPointerException شکست میخورد چون نمیتوان یک Integer null را بهصورت خودکار به int تبدیل کرد.
اگر دقیق به این کد نگاه کنید، map.values() یک Collection<Integer> است. پیمایش روی این کلکشن نمونههایی از Integer تولید میکند. چون value را بهعنوان int اعلام کردهاید، کامپایلر این Integer را بهصورت خودکار به int تبدیل میکند. این مکانیزم اگر نمونهی Integer null باشد با NullPointerException شکست میخورد.
میتوانید نقشه را با کد زیر اصلاح کنید که مقادیر null معیوب را با مقدار پیشفرض -1 جایگزین میکند:
خروجی کد بالا. همانطور که میبینید دیگر مقدار null وجود ندارد:
value = -1
value = 1
value = -1
value = 3
value = 5
میتوانید مقدار متصل به یک کلید مشخص را با فراخوانی متد get(key) دریافت کنید.
Java SE 8 متد getOrDefault() را معرفی کرد که یک کلید و یک مقدار پیشفرض دریافت میکند. اگر کلید در نقشه وجود نداشته باشد، مقدار پیشفرض برمیگردد.
این متد را در مثال زیر ببینید:
خروجی این کد:
[UNDEFINED, one, two, three, UNDEFINED]
یا اگر با Streamها آشنا هستید (که در بخش Stream API پوشش داده شده):
خروجی این کد:
values = [UNDEFINED, one, two, three, UNDEFINED]
حذف یک جفت کلید-مقدار با فراخوانی متد remove(key) انجام میشود. این متد مقداری که به آن کلید متصل بود را برمیگرداند، بنابراین ممکن است null برگرداند.
حذف کورکورانهی یک جفت کلید-مقدار وقتی مقدار متصل به کلید را نمیدانید ممکن است خطرناک باشد. به همین دلیل Java SE 8 نسخهی overloaded دیگری اضافه کرد که مقدار را بهعنوان آرگومان دوم دریافت میکند. این بار جفت کلید-مقدار فقط در صورتی حذف میشود که با جفت کلید-مقدار موجود در نقشه کاملاً مطابقت داشته باشد.
متد remove(key, value) یک مقدار boolean برمیگرداند: true اگر جفت کلید-مقدار حذف شده باشد.
این دو الگو را در مثال زیر ببینید:
خروجی این کد:
Map: {1=one, 2=two, 3=three}
Removing 3: three
Removing 4: null
Removing 2 if bound to 'one': false
Map: {1=one, 2=two}
دو متد برای بررسی وجود یک کلید یا مقدار مشخص دارید: containsKey(key) و containsValue(value). هر دو اگر نقشه شامل کلید یا مقدار مورد نظر باشد true برمیگردانند.
خروجی این کد:
Map: {1=one, 2=two, 3=three}
Contains key 3? true
Contains key 4? false
Contains value 'one'? true
Contains value 'zero'? false
رابطهی Map متدهایی شبیه به رابطهی Collection دارد: isEmpty() برای نقشههای خالی true برمیگرداند، size() تعداد جفتهای کلید-مقدار را برمیگرداند و clear() تمام محتوا را حذف میکند.
خروجی این کد:
Is empty? false
Size: 3
Is empty? true
Size: 0
متد دیگری هم برای اضافه کردن محتوای یک نقشه به نقشه فعلی وجود دارد: putAll(otherMap). اگر کلیدهایی در هر دو نقشه وجود داشته باشند، مقادیر otherMap مقادیر نقشه فعلی را پاک میکنند.
خروجی این کد:
Map: {1=one, 2=two, 3=three}
Other map: {2=TWO, 3=THREE, 4=FOUR}
Map: {1=one, 2=TWO, 3=THREE, 4=FOUR}
Other map: {2=TWO, 3=THREE, 4=FOUR}
میتوانید کلکشنهای مختلفی از یک نقشه دریافت کنید:
keySet(): یک نمونه از Set حاوی کلیدهای تعریفشده در نقشهentrySet(): یک نمونه از Set<Map.Entry> حاوی جفتهای کلید-مقدارvalues(): یک نمونه از Collection حاوی مقادیر موجود در نقشهخروجی این کد:
keys = [1, 2, 3]
Adding 4
values = [one, two, three, four]
Adding 5
values = [one, two, three, four, five]
entries = [1=one, 2=two, 3=three, 4=four, 5=five]
Adding 6
entries = [1=one, 2=two, 3=three, 4=four, 5=five, 6=six]
این مجموعهها ویوهایی بر پایهی نقشه فعلی هستند. هر تغییری در نقشه در این ویوها منعکس میشود.
تغییر یکی از این مجموعهها در نقشه هم منعکس میشود: مثلاً حذف کلیدی از مجموعه برگشتی keySet()، جفت کلید-مقدار مربوطه را از نقشه حذف میکند.
خروجی این کد:
Map: {1=one, 2=two, 3=three, 4=four, 5=five, 6=six}
keys = [1, 2, 3, 4, 5, 6]
Removing 3
Map: {1=one, 2=two, 4=four, 5=five, 6=six}
entries = [1=one, 2=two, 4=four, 5=five, 6=six]
Removing 4
Map: {1=one, 2=two, 5=five, 6=six}
حذف مقدار به همین سادگی نیست چون یک مقدار ممکن است بیش از یک بار در نقشه وجود داشته باشد. در این حالت، حذف از مجموعهی مقادیر فقط اولین جفت کلید-مقدار مطابق را حذف میکند.
خروجی این کد:
map before = {3=three, 2=two, 1=one, 4=three}
map after = {1=one, 2=two, 4=three}
دقت کنید فقط اولین جفت کلید-مقدار حذف شده است. اگر پیادهسازی شما
HashMapباشد، نمیتوانید از قبل مشخص کنید کدام جفت کلید-مقدار پیدا خواهد شد.
به تمام عملیات روی این مجموعهها دسترسی ندارید. مثلاً نمیتوانید به مجموعهی کلیدها یا مجموعهی مقادیر عنصری اضافه کنید. در غیر این صورت خطای UnsupportedOperationException دریافت خواهید کرد.
اگر نیاز به پیمایش جفتهای کلید-مقدار یک نقشه دارید، بهترین انتخاب پیمایش مستقیم روی مجموعهی entryهاست. بسیار کارآمدتر از پیمایش روی مجموعهی کلیدها و دریافت مقدار مربوطه است.
خروجی این کد:
entry = 4=three
entry = 3=three
entry = 2=two
entry = 1=one
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/