CodeGym /جاوا بلاگ /Random-SD /HashMap computeIfAbsent() جاوا ۾ طريقو
John Squirrels
سطح
San Francisco

HashMap computeIfAbsent() جاوا ۾ طريقو

گروپ ۾ شايع ٿيل
جاوا 8، جيئن اسان مان گھڻا ڄاڻون ٿا، اسٽريم API متعارف ڪرايو. هي هڪ تمام ڪارائتو ٽول ڪٽ آهي، پر ان ۾ هڪ خرابي آهي، ان ۾ نقشو شامل ناهي . بهرحال، جاوا 8 ڪيترن ئي مفيد طريقن کي شامل ڪيو نقشي جي انٽرفيس ۾ پاڻ کي "خراب" ڪوڊ جي مقدار کي گھٽائڻ لاء. تنهن ڪري، جيڪڏهن توهان کي نقشي ۾ قدر سان ڪجهه عمل ڪرڻ جي ضرورت آهي ، جيڪڏهن اهو ان ۾ موجود آهي، جاوا نقشي ۾ هڪ ComputeIfPresent() طريقو آهي . جيڪڏھن توھان کي ڪجھ ڪرڻ جي ضرورت آھي ھڪڙي قدر سان جيڪو نقشي ۾ نه آھي ، توھان استعمال ڪري سگھو ٿا ComputeIfAbsent() طريقو. اسان هن مضمون ۾ غور ڪندو.

computeIfAbsent() طريقو دستخط

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Map (۽ HashMap ) computeIfAbsent () طريقو ٻه پيرا ميٽر وٺندو آهي. پهريون پيٽرولر اهم آهي. ٻيو پيٽرولر آهي mappingFunction . هن طريقي ۾ ميپنگ فنڪشن صرف ان صورت ۾ سڏيو ويندو آهي جڏهن ميپنگ پيش نه ڪئي وئي آهي.

ڪيئن computeIfAbsent() طريقو ڪم ڪندو آهي

جيئن ته اسان اڳ ۾ ئي ڄاڻون ٿا، Map.computeIfAbsent() طريقو ٻه پيرا ميٽرز، ڪيئي ۽ فنڪشن کي ڳڻڻ لاء هن ڪيئي ميپنگ فنڪشن جي قيمت کي ڳڻڻ لاء منظور ڪيو ويو آهي . هتي طريقي جي منطقي الگورتھم آهي:
  1. طريقو پهرين چيڪ ڪري ٿو ته پاس ڪيل ڪيئي اسان جي نقشي ۾ نمائندگي ڪئي وئي آهي .
  2. جيڪڏهن اهم نقشي ۾ نمائندگي ڪئي وئي آهي (۽ اهو ناڪاري ناهي)، پوء طريقو ڪجھ به نه ڪندو.
  3. ٻي صورت ۾ جيڪڏهن ڪيچي نقشي ۾ نمائندگي نه ڪري ٿي (يا اهو null آهي) طريقو حساب ڪري ٿو قدر کي استعمال ڪندي ڪيچي کي mappingFunction .
  4. جيڪڏهن نتيجو نڪرندڙ قدر خالي نه آهي، ته نقشي لاءِ هڪ اهم-قدر جوڙو لکو.
اچو ته ساڳيو منطق لکون جيئن ڪوڊ:
if (map.get(key) == null)
{
V newValue = mappingFunction.apply(key);
if (newValue != null) map.put(key, newValue);
}

computeIfAbsent() ڪوڊ مثال

تنهن ڪري، جيڪڏهن قيمت نقشي ۾ نه آهي ، پوء طريقو تبديلين کي انجام ڏيندو. اچو ته هڪ سادي مثال تي هڪ نظر وٺو:
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"));
       }
}
پيداوار آهي:
هتي منهنجي ڪنجي آهي، ۽ هي هڪ نئين قيمت آهي
هاڻي اچو ته ڏسو ته اهو طريقو ڇا ڪندو جڏهن نقشي ۾ ڏنل قدر موجود آهي . اسپيلر خبردار: اهو ڪجھ به نه ڪندو.
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")));
   }

}
هتي جي پيداوار آهي:
parsing: 10 parsing: 25 10+25=35 parsing: 20 20+25=45 10+20=30
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION