CodeGym /وبلاگ جاوا /Random-FA /متد HashMap computeIfAbsent() در جاوا
John Squirrels
مرحله
San Francisco

متد HashMap computeIfAbsent() در جاوا

در گروه منتشر شد
جاوا 8، همانطور که بسیاری از ما می دانیم، API Stream را معرفی کرد. این یک جعبه ابزار بسیار مفید است، اما یک ایراد دارد، شامل Map s نمی شود. با این حال، جاوا 8 چندین روش مفید را به رابط Map اضافه کرد تا میزان کدهای «بد» را کاهش دهد. بنابراین، اگر شما نیاز به انجام عملی با مقدار موجود در Map دارید، اگر در آن وجود دارد، یک متد ComputeIfPresent() در Java Map وجود دارد. اگر نیاز به انجام کاری با مقداری دارید که در Map نیست ، می توانید از متد ComputeIfAbsent() استفاده کنید . ما در این مقاله آن را در نظر خواهیم گرفت.

امضای متد computeIfAbsent().

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
متد Map (و HashMap ) computeIfAbsent () دو پارامتر می گیرد. پارامتر اول کلید است. پارامتر دوم mappingFunction است . در این روش تابع نگاشت تنها در صورتی فراخوانی می شود که نگاشت ارائه نشده باشد.

روش کارکرد متد computeIfAbsent()

همانطور که می دانیم، به متد Map.computeIfAbsent() دو پارامتر، کلید و تابع برای محاسبه مقدار این کلید mappingFunction ارسال می شود . در اینجا الگوریتم منطقی روش آمده است:
  1. این روش ابتدا بررسی می‌کند که آیا کلید ارسال شده در نقشه ما نشان داده شده است یا خیر .
  2. اگر کلید در Map نشان داده شده باشد (و تهی نباشد)، این روش هیچ کاری انجام نمی دهد.
  3. در غیر این صورت، اگر کلید در Map نشان داده نمی شود (یا تهی است)، روش مقدار را با استفاده از mappingFunction برای کلید محاسبه می کند.
  4. اگر مقدار به دست آمده تهی نیست، یک جفت کلید-مقدار برای نقشه بنویسید.
بیایید همان منطق کد را بنویسیم:
if (map.get(key) == null)
{
V newValue = mappingFunction.apply(key);
if (newValue != null) map.put(key, newValue);
}

مثال کد computeIfAbsent().

بنابراین، اگر مقدار در Map نباشد ، متد تغییرات را انجام خواهد داد. بیایید به یک مثال ساده نگاهی بیندازیم:
import java.util.HashMap;
import java.util.Map;

//map.computeIfAbsent example
public class ComputeIfAbsentExample {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
خروجی این است:
اینجا کلید من است، و این یک مقدار جدید است
حالا بیایید ببینیم وقتی یک مقدار مشخص در Map وجود دارد، روش چه کاری انجام می دهد . هشدار اسپویلر: هیچ کاری نمی کند.
import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample2 {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();
           myMap.put("here is my key", "and here is my value");

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
در اینجا خروجی است:
و ارزش من اینجاست
همانطور که می بینید، مقدار بدون تغییر باقی می ماند.

یک مثال دیگر () ComputeIfAbsent

اگر با مفهوم کش آشنایی دارید، متد computeIfAbsent() احتمالا چیزی را به شما یادآوری می کند. بیایید نگاهی به یک مثال تجزیه پیچیده تر بیندازیم. بیایید متد computeIfAbsent() را دو بار فراخوانی کنیم تا مطمئن شویم که در حالت اول مقدار تغییر می کند، در حالی که در حالت دوم تغییر نمی کند.
import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample {
   private static Map<String, Long> numbersMap = new HashMap<>();

   public static Long stringToLong(String str) {
       return numbersMap.computeIfAbsent(str, key -> {
           System.out.println("parsing: " + key);
           return Long.parseLong(key);
       });
   }

   public static void main(String[] args) {
       // will print:
       // > parsing: 10
       // > parsing: 25
       // > 10+25=35
       System.out.println("10+25=" + (stringToLong("10") + stringToLong("25")));
       // will print:
       // > parsing: 20
       // > 10+25=45
       // only "20" will be parsed this time, since "25" was already parsed and placed into `numbersMap` map before
       System.out.println("20+25=" + (stringToLong("20") + stringToLong("25")));
       // will print:
       // > 10+20=30
       // no parsing will occur, since both "10" and "20" were already parsed and placed into `numbersMap` map before
       System.out.println("10+20=" + (stringToLong("10") + stringToLong("20")));
   }

}
در اینجا خروجی است:
تجزیه: 10 تجزیه: 25 10+25=35 تجزیه: 20 20+25=45 10+20=30
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION