जावा 8 में :: ऑपरेटर (Double Colon): शुरुआत से विशेषज्ञ तक
\n\nक्या आपने कभी जावा 8 में कोड लिखा है और System.out::println या String::length जैसी अजीब संरचना देखी है? यह जादू जैसा लगता है, है ना? वास्तव में, यह जादू नहीं है, बल्कि आधुनिक जावा के सबसे सुंदर टूल में से एक है — डबल कोलन ऑपरेटर (जिसे double colon operator या मेथड रेफरेंस भी कहा जाता है)।
इस लेख में, हम :: ऑपरेटर को बुनियादी से लेकर उन्नत तकनीकों तक समझेंगे। आप अधिक स्वच्छ, संक्षिप्त और पढ़ने योग्य कोड लिखना सीखेंगे। चलिए शुरू करते हैं!
:: ऑपरेटर क्या है और इसकी आवश्यकता क्यों है?
\n\n:: ऑपरेटर (double colon) जावा 8 में लैम्ब्डा एक्सप्रेशन के लिए सिंटैक्टिक शुगर के रूप में पेश किया गया था। यदि कोई लैम्ब्डा एक्सप्रेशन केवल किसी मौजूदा मेथड को कॉल करता है, तो आप इसे मेथड रेफरेंस से बदल सकते हैं। यह कोड को छोटा और अधिक अभिव्यंजक बनाता है।
खुद तुलना करें:
\n\n// लैम्ब्डा एक्सप्रेशन\nlist.forEach(s -> System.out.println(s));\n\n// मेथड रेफरेंस (:: ऑपरेटर)\nlist.forEach(System.out::println);\n\nदूसरा विकल्प न केवल छोटा है, बल्कि तुरंत बताता है: "प्रत्येक एलिमेंट के लिए, System.out पर println मेथड कॉल करें"। सुंदरता!
\n\nमेथड रेफरेंस के चार प्रकार
\n\nजावा 8 में method reference के चार मुख्य प्रकार हैं। आइए प्रत्येक को उदाहरणों के साथ समझते हैं।
\n\n1. स्टैटिक मेथड का रेफरेंस
\n\nसिंटैक्स: ClassName::staticMethodName
उदाहरण: सूची में सम संख्याओं की गिनती करना।
\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class StaticMethodReference {\n public static boolean isEven(Integer number) {\n return number % 2 == 0;\n }\n\n public static void main(String[] args) {\n List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);\n \n // लैम्ब्डा\n long countLambda = numbers.stream()\n .filter(n -> StaticMethodReference.isEven(n))\n .count();\n \n // स्टैटिक मेथड का रेफरेंस\n long countRef = numbers.stream()\n .filter(StaticMethodReference::isEven)\n .count();\n \n System.out.println("सम संख्याएँ: " + countRef); // 3\n }\n}\n\nध्यान दें: हम isEven मेथड को कॉल नहीं कर रहे हैं — हम केवल इसका रेफरेंस पास कर रहे हैं। जावा स्वचालित रूप से सूची के प्रत्येक एलिमेंट को आर्गुमेंट के रूप में रखेगा।
2. किसी विशिष्ट ऑब्जेक्ट के इंस्टेंस मेथड का रेफरेंस
\n\nसिंटैक्स: objectReference::instanceMethodName
इस प्रकार का उपयोग तब किया जाता है जब आपके पास पहले से कोई विशिष्ट ऑब्जेक्ट हो और आप उसका मेथड कॉल करना चाहते हों।
\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class InstanceMethodReference {\n public static void main(String[] args) {\n List<String> names = Arrays.asList("अन्ना", "बोरिस", "विक्टर");\n \n // StringBuilder ऑब्जेक्ट बनाएँ\n StringBuilder sb = new StringBuilder("नाम: ");\n \n // लैम्ब्डा\n names.forEach(name -> sb.append(name).append(" "));\n \n // इंस्टेंस मेथड का रेफरेंस\n // (लेकिन append StringBuilder लौटाता है, इसलिए लैम्ब्डा का उपयोग करें)\n // जबकि System.out.println के लिए - यह आदर्श है:\n names.forEach(System.out::println);\n \n System.out.println(sb.toString()); // नाम: अन्ना बोरिस विक्टर\n }\n}\n\nक्लासिक उदाहरण — System.out::println। System.out एक विशिष्ट PrintStream ऑब्जेक्ट है, और println इसका मेथड है।
3. किसी निश्चित प्रकार के किसी भी ऑब्जेक्ट के इंस्टेंस मेथड का रेफरेंस
\n\nसिंटैक्स: ClassName::instanceMethodName
इस प्रकार को अक्सर पिछले वाले से भ्रमित किया जाता है। यहाँ हम कोई विशिष्ट ऑब्जेक्ट निर्दिष्ट नहीं करते हैं — इसके बजाय हम कहते हैं: "इस क्लास का कोई भी ऑब्जेक्ट लो और उस पर मेथड कॉल करो"।
\n\nब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
Rust में परीक्षण: यूनिट, इंटीग्रेशन, E2E उन्नत स्तर पर
Rust कोड की प्रोफाइलिंग: शुरुआती लोगों के लिए बाधाएं खोजना
जावा में JSON पार्सिंग: 20 मिनट में शुरुआती से विशेषज्ञ तक
C# bin\\roslyn में csc.exe के बारे में क्यों चिल्लाता है? शीर्ष 5 त्रुटियाँ और समाधान
Kotlin में «instanceof»: is और when के साथ प्रकार की जाँच (गाइड)