जावा में कार्यात्मक प्रोग्रामिंग: A से Z तक
\n\nकार्यात्मक प्रोग्रामिंग (FP) एक प्रतिमान है जिसमें गणनाओं को गणितीय फलनों की गणना के रूप में माना जाता है, जिसमें स्थिति में परिवर्तन और परिवर्तनीय डेटा से बचा जाता है। जावा, पारंपरिक रूप से एक अनिवार्य भाषा, संस्करण 8 से शुरू होकर, सक्रिय रूप से FP के तत्वों को शामिल कर रहा है। यह विशेष रूप से संग्रह और अतुल्यकालिक संचालन के साथ काम करते समय अधिक संक्षिप्त, पूर्वानुमानित और आसानी से परीक्षण योग्य कोड लिखने की अनुमति देता है।
\n\nइस लेख में, हम जावा में FP की प्रमुख अवधारणाओं को समझेंगे: लैम्ब्डा एक्सप्रेशन से लेकर Stream API और Optional के साथ काम करने की उन्नत तकनीकों तक। आप सीखेंगे कि इन उपकरणों को व्यवहार में कैसे लागू करें ताकि आपका कोड साफ और अधिक कुशल हो जाए।
\n\n1. मूल बातें: लैम्ब्डा एक्सप्रेशन और कार्यात्मक इंटरफ़ेस
\n\nलैम्ब्डा एक्सप्रेशन एक अनाम विधि (फलन) लिखने का एक संक्षिप्त रूप है। यह व्यवहार को डेटा के रूप में पारित करने की अनुमति देता है। सिंटैक्स: (पैरामीटर) -> बॉडी।
कार्यात्मक इंटरफ़ेस एक इंटरफ़ेस है जिसमें केवल एक अमूर्त विधि (SAM - Single Abstract Method) होती है। ऐसे इंटरफ़ेस को लैम्ब्डा के माध्यम से कार्यान्वित किया जा सकता है। java.util.function में प्रमुख अंतर्निहित इंटरफ़ेस:
- \n
Predicate<T>— T ऑब्जेक्ट लेता है, boolean लौटाता है (विधिtest)। \n Function<T, R>— T लेता है, R लौटाता है (विधिapply)। \n Consumer<T>— T लेता है, कुछ नहीं लौटाता (विधिaccept)। \n Supplier<T>— कुछ नहीं लेता, T लौटाता है (विधिget)। \n UnaryOperator<T>— Function का एक विशेष मामला, जहाँ T और R एक ही प्रकार के होते हैं। \n
उदाहरण: Comparator (कार्यात्मक इंटरफ़ेस) के साथ सूची को सॉर्ट करना
\n\nimport java.util.*;\n\npublic class LambdaExample {\n public static void main(String[] args) {\n List<String> names = Arrays.asList("इवान", "अन्ना", "पीटर", "मारिया");\n\n // लैम्ब्डा के बिना (अनाम वर्ग)\n Collections.sort(names, new Comparator<String>() {\n @Override\n public int compare(String a, String b) {\n return a.length() - b.length();\n }\n });\n\n // लैम्ब्डा के साथ\n Collections.sort(names, (a, b) -> a.length() - b.length());\n\n // और भी छोटा: Comparator.comparingInt का उपयोग करें\n names.sort(Comparator.comparingInt(String::length));\n\n System.out.println(names); // [अन्ना, पीटर, इवान, मारिया]\n }\n}\n\nउदाहरण: फ़िल्टरिंग के लिए Predicate का उपयोग
\n\nimport java.util.function.Predicate;\n\npublic class PredicateExample {\n public static void main(String[] args) {\n Predicate<Integer> isEven = n -> n % 2 == 0;\n Predicate<Integer> isPositive = n -> n > 0;\n\n System.out.println(isEven.test(4)); // true\n System.out.println(isEven.and(isPositive).test(-2)); // false (धनात्मक नहीं)\n System.out.println(isEven.or(isPositive).test(-3)); // true (सम नहीं, लेकिन धनात्मक? नहीं, -3 धनात्मक नहीं है)\n }\n}\n\n2. Stream API: डेटा प्रोसेसिंग का शक्तिशाली उपकरण
\n\nStream API तत्वों का एक अनुक्रम है जो समानांतर और अनुक्रमिक संचालन का समर्थन करता है। Stream डेटा को संग्रहीत नहीं करता, बल्कि उसे रूपांतरित करता है। प्रमुख संचालन मध्यवर्ती (नया Stream लौटाते हैं) और टर्मिनल (प्रसंस्करण समाप्त करते हैं और परिणाम या दुष्प्रभाव लौटाते हैं) में विभाजित होते हैं।
\n\nStream API के मुख्य संचालन:
\n- \n
- मध्यवर्ती:
filter,map,flatMap,sorted,distinct,peek,limit,skip। \n - टर्मिनल:
collec