CodeGym /Java Blog /अनियमित /जावा में हैशमैप कंप्यूटइफएब्सेंट () विधि
John Squirrels
स्तर 41
San Francisco

जावा में हैशमैप कंप्यूटइफएब्सेंट () विधि

अनियमित ग्रुप में प्रकाशित
जावा 8, जैसा कि हम में से बहुत से जानते हैं, ने स्ट्रीम एपीआई की शुरुआत की। यह एक बहुत ही उपयोगी टूलकिट है, लेकिन इसमें एक खामी है, इसमें मैप एस शामिल नहीं है। हालाँकि, जावा 8 ने "खराब" कोड की मात्रा को कम करने के लिए मैप इंटरफ़ेस में कई उपयोगी तरीके जोड़े । इसलिए, यदि आपको मानचित्र में मान के साथ कुछ क्रिया करने की आवश्यकता है , यदि यह उसमें मौजूद है, तो जावा मानचित्र में ComputeIfPresent() विधि है। यदि आपको किसी ऐसे मान के साथ कुछ करने की ज़रूरत है जो मानचित्र में नहीं है , तो आप ComputeIfAbsent() विधि का उपयोग कर सकते हैं। हम इस लेख में इस पर विचार करेंगे।

कंप्यूटइफएब्सेंट () विधि हस्ताक्षर


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
मैप (और हैश मैप ) कंप्यूटइफएब्सेंट () विधि दो पैरामीटर लेती है पहला पैरामीटर कुंजी है। दूसरा पैरामीटर मैपिंगफंक्शन है । इस पद्धति में मैपिंग फ़ंक्शन को केवल तभी कहा जाता है जब मैपिंग प्रस्तुत नहीं की जाती है।

ComputeIfAbsent() मेथड कैसे काम करता है

जैसा कि हम पहले से ही जानते हैं, Map.computeIfAbsent() विधि इस कुंजी मैपिंग फ़ंक्शन के मान की गणना करने के लिए दो पैरामीटर, कुंजी और फ़ंक्शन पास की जाती है । यहाँ विधि का तार्किक एल्गोरिथ्म है:
  1. विधि पहले जांचती है कि पारित कुंजी हमारे मानचित्र में प्रदर्शित होती है या नहीं ।
  2. यदि मानचित्र में कुंजी का प्रतिनिधित्व किया जाता है (और यह शून्य नहीं है), तो विधि कुछ नहीं करती है।
  3. अन्यथा यदि कुंजी मानचित्र (या यह शून्य है) में प्रतिनिधित्व नहीं करती है तो विधि मैपिंग फ़ंक्शन का उपयोग करके कुंजी पर मान की गणना करती है।
  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 () विधि शायद आपको कुछ याद दिलाती है। आइए एक अधिक जटिल पार्सिंग उदाहरण देखें। आइए यह सुनिश्चित करने के लिए कंप्यूटइफएबसेंट () विधि को दो बार कॉल करें कि पहले मामले में मान बदलता है, जबकि दूसरे मामले में ऐसा नहीं होता है।

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