ग्रूवी - क्लोजर

एक बंद कोड का एक संक्षिप्त अनाम ब्लॉक है। यह सामान्य रूप से कोड की कुछ पंक्तियों तक फैला है। एक विधि एक पैरामीटर के रूप में कोड के ब्लॉक को भी ले सकती है। वे प्रकृति में गुमनाम हैं।

निम्नलिखित एक साधारण क्लोजर का उदाहरण है और यह कैसा दिखता है।

class Example {
   static void main(String[] args) {
      def clos = {println "Hello World"};
      clos.call();
   } 
}

उपरोक्त उदाहरण में, कोड लाइन - {Println "हैलो वर्ल्ड"} को एक क्लोजर के रूप में जाना जाता है। इस पहचानकर्ता द्वारा संदर्भित कोड ब्लॉक को कॉल स्टेटमेंट के साथ निष्पादित किया जा सकता है।

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

Hello World

क्लोजर में औपचारिक पैरामीटर

ग्रूवी के तरीकों की तरह उन्हें अधिक उपयोगी बनाने के लिए क्लोजर में औपचारिक पैरामीटर भी हो सकते हैं।

class Example {
   static void main(String[] args) {
      def clos = {param->println "Hello ${param}"};
      clos.call("World");
   } 
}

उपरोक्त कोड उदाहरण में, $ {param} के उपयोग पर ध्यान दें जो एक पैरामीटर लेने के लिए बंद होने का कारण बनता है। क्लोज.ल स्टेटमेंट के माध्यम से क्लोजर को कॉल करते समय हमारे पास अब क्लोजर के लिए एक पैरामीटर पास करने का विकल्प होता है।

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

Hello World

अगला चित्रण पिछले उदाहरण को दोहराता है और उसी परिणाम को उत्पन्न करता है, लेकिन यह दर्शाता है कि एक अंतर्निहित एकल पैरामीटर जिसका उपयोग किया जाता है। यहाँ 'इट' ग्रूवी में एक कीवर्ड है।

class Example {
   static void main(String[] args) {
      def clos = {println "Hello ${it}"};
      clos.call("World");
   } 
}

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

Hello World

क्लोजर और चर

अधिक औपचारिक रूप से, क्लोजर उस समय चर को संदर्भित कर सकता है जब क्लोजर परिभाषित होता है। निम्नलिखित इस बात का उदाहरण है कि इसे कैसे प्राप्त किया जा सकता है।

class Example {     
   static void main(String[] args) {
      def str1 = "Hello";
      def clos = {param -> println "${str1} ${param}"}
      clos.call("World");
		
      // We are now changing the value of the String str1 which is referenced in the closure
      str1 = "Welcome";
      clos.call("World");
   } 
}

उपरोक्त उदाहरण में, बंद करने के लिए एक पैरामीटर पारित करने के अलावा, हम str1 नामक एक चर को भी परिभाषित कर रहे हैं। बंद पैरामीटर के साथ चर पर भी ले जाता है।

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

Hello World 
Welcome World

विधियों में क्लोजर का उपयोग करना

क्लोजर को विधियों के मापदंडों के रूप में भी इस्तेमाल किया जा सकता है। ग्रूवी में, डेटा प्रकारों जैसे सूचियों और संग्रह के लिए बहुत सारे इनबिल्ट तरीके पैरामीटर प्रकार के रूप में बंद हो जाते हैं।

निम्न उदाहरण दिखाता है कि एक पैरामीटर के रूप में एक बंद विधि को कैसे भेजा जा सकता है।

class Example { 
   def static Display(clo) {
      // This time the $param parameter gets replaced by the string "Inner"         
      clo.call("Inner");
   } 
	
   static void main(String[] args) {
      def str1 = "Hello";
      def clos = { param -> println "${str1} ${param}" }
      clos.call("World");
		
      // We are now changing the value of the String str1 which is referenced in the closure
      str1 = "Welcome";
      clos.call("World");
		
      // Passing our closure to a method
      Example.Display(clos);
   } 
}

उपरोक्त उदाहरण में,

  • हम प्रदर्शन नामक एक स्थिर विधि को परिभाषित कर रहे हैं जो एक तर्क के रूप में बंद हो जाता है।

  • फिर हम अपनी मुख्य विधि में एक क्लोजर को परिभाषित कर रहे हैं और इसे एक पैरामीटर के रूप में हमारे डिस्प्ले विधि में पास कर रहे हैं।

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

Hello World 
Welcome World 
Welcome Inner

कलेक्शन और स्ट्रिंग में क्लोजर

कई सूची, मानचित्र और स्ट्रिंग विधियां एक तर्क के रूप में एक समापन को स्वीकार करती हैं। आइए उदाहरण देखें कि इन डेटा प्रकारों में क्लोजर का उपयोग कैसे किया जा सकता है।

सूचियों के साथ क्लोजर का उपयोग करना

निम्न उदाहरण दिखाता है कि सूची के साथ क्लोजर का उपयोग कैसे किया जा सकता है। निम्नलिखित उदाहरण में हम पहले मूल्यों की एक सरल सूची को परिभाषित कर रहे हैं। सूची संग्रह प्रकार तब एक फ़ंक्शन को परिभाषित करता है जिसे कहा जाता है।each। यह फ़ंक्शन एक पैरामीटर के रूप में एक क्लोजर पर ले जाता है और सूची के प्रत्येक तत्व के लिए क्लोजर लागू करता है।

class Example {
   static void main(String[] args) {
      def lst = [11, 12, 13, 14];
      lst.each {println it}
   } 
}

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

11 
12 
13 
14

मैप्स के साथ क्लोजर का उपयोग करना

निम्न उदाहरण दिखाता है कि मैप्स के साथ क्लोजर का उपयोग कैसे किया जा सकता है। निम्नलिखित उदाहरण में हम पहले मुख्य मूल्य वस्तुओं के एक सरल मानचित्र को परिभाषित कर रहे हैं। मानचित्र संग्रह प्रकार तब .each नामक फ़ंक्शन को परिभाषित करता है। यह फ़ंक्शन एक पैरामीटर के रूप में एक क्लोजर पर ले जाता है और नक्शे के प्रत्येक कुंजी-मूल्य जोड़ी के क्लोजर को लागू करता है।

class Example {
   static void main(String[] args) {
      def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]             
      mp.each {println it}
      mp.each {println "${it.key} maps to: ${it.value}"}
   } 
}

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

TopicName = Maps 
TopicDescription = Methods in Maps 
TopicName maps to: Maps 
TopicDescription maps to: Methods in Maps

अक्सर, हम एक संग्रह के सदस्यों के बीच पुनरावृति करना चाहते हैं और केवल कुछ तर्क लागू कर सकते हैं जब तत्व कुछ कसौटी पर खरा उतरता है। यह आसानी से बंद में एक सशर्त बयान के साथ संभाला है।

class Example {
   static void main(String[] args) {
      def lst = [1,2,3,4];
      lst.each {println it}
      println("The list will only display those numbers which are divisible by 2")
      lst.each{num -> if(num % 2 == 0) println num}
   } 
}

उपरोक्त उदाहरण सशर्त दिखाता है यदि (संख्या% 2 == 0) क्लोजर में उपयोग किया जा रहा है जो यह जांचने के लिए उपयोग किया जाता है कि सूची में प्रत्येक आइटम 2 से विभाज्य है या नहीं।

जब हम उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलेंगे -

1 
2 
3 
4 
The list will only display those numbers which are divisible by 2.
2 
4

क्लोजर के साथ उपयोग किए जाने वाले तरीके

क्लोजर स्वयं कुछ तरीके प्रदान करते हैं।

अनु क्रमांक। तरीके और विवरण
1 लगता है ()

खोज विधि संग्रह में पहला मान ढूंढती है जो कुछ कसौटी से मेल खाता है।

2 सब ढूँढ़ो()

यह क्लोजर स्थिति से मेल खाते ऑब्जेक्ट में सभी मान पाता है।

3 कोई भी () और हर ()

विधि संग्रह संग्रह के प्रत्येक तत्व के माध्यम से किसी भी पुनरावृत्ति की जाँच करती है कि क्या एक बूलियन विधेय कम से कम एक तत्व के लिए मान्य है।

4 इकट्ठा ()

विधि एक संग्रह के माध्यम से पुनरावृत्तियों को इकट्ठा करती है, प्रत्येक तत्व को ट्रांसफार्मर के रूप में बंद करने का उपयोग करके एक नए मूल्य में परिवर्तित करती है।