जावा में फंक्शनल प्रोग्रामिंग: लैम्ब्डा से Stream API तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जावा में कार्यात्मक प्रोग्रामिंग का परिचय



लंबे समय तक, Java केवल ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) से जुड़ा था। हालांकि, 2014 में Java 8 के आगमन के साथ, भाषा ने कार्यात्मक प्रतिमान की ओर एक शक्तिशाली छलांग लगाई। Lambda एक्सप्रेशन, फंक्शनल इंटरफेस और Stream API ने कोड लिखने के तरीके को मौलिक रूप से बदल दिया, जिससे यह अधिक संक्षिप्त, पठनीय और त्रुटियों के प्रति कम संवेदनशील हो गया।



जावा में कार्यात्मक प्रोग्रामिंग OOP का प्रतिस्थापन नहीं है, बल्कि एक शक्तिशाली पूरक है। यह आपको डिक्लेरेटिव कोड लिखने की अनुमति देता है, जहाँ आप वर्णन करते हैं कि क्या करना है, न कि कैसे करना है। इस लेख में, हम उन प्रमुख अवधारणाओं पर चर्चा करेंगे जो आपको Java में कार्यात्मक शैली में महारत हासिल करने में मदद करेंगी, और व्यावहारिक उदाहरण दिखाएंगे।



1. Lambda एक्सप्रेशन और फंक्शनल इंटरफेस



जावा में कार्यात्मक प्रोग्रामिंग का आधार Lambda एक्सप्रेशन हैं - यह अनाम फंक्शन को लागू करने का एक संक्षिप्त तरीका है। सिंटैक्टिक रूप से, lambda में पैरामीटर की सूची, एक तीर (->) और एक बॉडी होती है:



(पैरामीटर) -> { बॉडी }


Lambda हमेशा फंक्शनल इंटरफेस के साथ जोड़े में काम करते हैं। फंक्शनल इंटरफेस एक ऐसा इंटरफेस है जिसमें ठीक एक एब्सट्रैक्ट मेथड होता है (उदाहरण के लिए, Runnable, Comparator, Predicate)।



व्यावहारिक उदाहरण: अनाम क्लास का प्रतिस्थापन



आइए पुराने (OOP) और नए (कार्यात्मक) दृष्टिकोण की तुलना करें:



// पुराना तरीका (अनाम क्लास)Runnable taskOld = new Runnable() {    @Override    public void run() {        System.out.println("अनाम क्लास से नमस्ते!");    }};

// नया तरीका (lambda)Runnable taskNew = () -> System.out.println("Lambda से नमस्ते!");

// रन करनाtaskNew.run();


जैसा कि आप देख सकते हैं, lambda ने कोड को 6 पंक्तियों से घटाकर 1 कर दिया, जबकि पूर्ण कार्यक्षमता बनाए रखी।



बिल्ट-इन फंक्शनल इंटरफेस (पैकेज java.util.function)



Java बिल्ट-इन इंटरफेस का एक समृद्ध सेट प्रदान करता है। यहाँ चार मुख्य हैं:



  • Predicate<T> — एक ऑब्जेक्ट लेता है, boolean लौटाता है। फ़िल्टरिंग के लिए उपयोग किया जाता है।
  • Function<T, R> — एक प्रकार का ऑब्जेक्ट लेता है, दूसरे प्रकार का ऑब्जेक्ट लौटाता है। रूपांतरण के लिए।
  • Consumer<T> — एक ऑब्जेक्ट लेता है, कुछ भी नहीं लौटाता (void)। साइड इफेक्ट्स के लिए (प्रिंट करना)।
  • Supplier<T> — कुछ नहीं लेता, एक ऑब्जेक्ट लौटाता है। लेज़ी डेटा जनरेशन के लिए।


Predicate के साथ उदाहरण:



import java.util.function.Predicate;

public class Main { public static void main(String[] args) { Predicate<Integer> isEven = n -> n % 2 == 0; System.out.println(isEven.test(10)); // true System.out.println(isEven.test(7)); // false }}


2. Stream API: कार्यात्मक शैली में कलेक्शन के साथ काम करना



Stream API जावा में कार्यात्मक प्रोग्रामिंग का रत्न है। एक स्ट्रीम (Stream) एलिमेंट का एक अनुक्रम है जो अनुक्रमिक और समानांतर संचालन का समर्थन करता है। मुख्य लाभ: आप मूल डेटा को संशोधित नहीं करते हैं, बल्कि एक नया परिणाम बनाते हैं।



Stream API तीन चरणों पर आधारित है:

  1. स्ट्रीम बनाना (कलेक्शन, ऐरे या जनरेटर से)।
  2. इंटरमीडिएट ऑपरेशन (फ़िल्टरिंग, सॉर्टिंग, रूपांतरण)। एक नया Stream लौटाते हैं।
  3. टर्मिनल ऑपरेशन (परिणाम एकत्र करना, गिनना, खोजना)। स्ट्रीम का काम समाप्त करता है।


उदाहरण: सूची को फ़िल्टर और रूपांतरित करना



मान लीजिए, हमारे पास स्ट्रिंग की एक सूची है, और हम केवल वे स्ट्रिंग प्राप्त करना चाहते हैं जो 3 वर्णों से लंबी हैं, उन्हें अपरकेस में बदलना चाहते हैं और सॉर्ट करना चाहते हैं।



import java.u                

ब्लॉग

पुस्तक अनुशंसाएँ