1. जावा 8 में नवाचार: कार्यात्मक प्रोग्रामिंग

जावा 8 की रिलीज़ के साथ, भाषा को कार्यात्मक प्रोग्रामिंग के लिए शक्तिशाली समर्थन प्राप्त हुआ । आप यह भी कह सकते हैं कि कार्यात्मक प्रोग्रामिंग के लिए इसे लंबे समय से प्रतीक्षित समर्थन प्राप्त हुआ। कोडिंग तेज़ हो गई, हालाँकि कोड को पढ़ना 🙂 अधिक कठिन था

जावा में कार्यात्मक प्रोग्रामिंग सीखने से पहले , हम अनुशंसा करते हैं कि आप तीन चीजों को अच्छी तरह से समझ लें:

  1. OOP, वंशानुक्रम और इंटरफेस ( जावा कोर खोज में स्तर 1-2 )।
  2. इंटरफ़ेस में डिफ़ॉल्ट विधि कार्यान्वयन
  3. आंतरिक और अनाम वर्ग

अच्छी खबर यह है कि जावा में कार्यात्मक प्रोग्रामिंग की कई विशेषताओं का उपयोग करने के लिए आपको यह सब जानने की जरूरत नहीं है। बुरी खबर यह है कि यह समझना मुश्किल होगा कि गुमनाम आंतरिक कक्षाओं के बारे में जाने बिना सब कुछ कैसे व्यवस्थित किया जाता है और सब कुछ कैसे काम करता है।

आगामी पाठों में, हम इस बात पर ध्यान केंद्रित करेंगे कि जावा की कार्यात्मक प्रोग्रामिंग सुविधाओं का उपयोग करना कितना आसान और सरल है, यह कैसे काम करता है, इसकी गहरी समझ के बिना।

जावा में कार्यात्मक प्रोग्रामिंग की सभी बारीकियों को समझने में महीनों लग जाते हैं। आप कुछ ही घंटों में ऐसे कोड को पढ़ना सीख सकते हैं। इसलिए हम छोटे से शुरुआत करने का सुझाव देते हैं। भले ही यह I/O स्ट्रीम के साथ हो।


2. I/O स्ट्रीम: स्ट्रीम पाइपलाइन

क्या आपको याद है कि एक बार आपने I/O स्ट्रीम: InputStream, OutputStream, Reader, Writerआदि के बारे में सीखा था?

स्ट्रीम क्लासेस थीं जो डेटा स्रोतों से डेटा पढ़ती थीं , जैसे कि FileInputSteam, और इंटरमीडिएट डेटा स्ट्रीम्स थीं जो अन्य स्ट्रीम्स से डेटा पढ़ती थीं, जैसे InputStreamReaderऔर BufferedReader

इन धाराओं को डाटा प्रोसेसिंग पाइपलाइनों में व्यवस्थित किया जा सकता है। उदाहरण के लिए, इस तरह:

FileInputStream input = new FileInputStream("c:\\readme.txt");
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buff = new BufferedReader(reader);

String text = buff.readLine();

यह ध्यान रखना महत्वपूर्ण है कि कोड की पहली कुछ पंक्तियों में, हम केवल Streamवस्तुओं की एक श्रृंखला बना रहे हैं। डेटा अभी तक पाइपलाइन से नहीं गुजरा है।

लेकिन जैसे ही हम buff.readLine()विधि कहते हैं, निम्नलिखित घटित होगा:

  1. ऑब्जेक्ट ऑब्जेक्ट पर विधि को BufferedReaderकॉल करता हैread()InputStreamReader
  2. ऑब्जेक्ट ऑब्जेक्ट पर विधि को InputStreamReaderकॉल करता हैread()FileInputStream
  3. ऑब्जेक्ट फ़ाइल सेFileInputStream डेटा पढ़ना प्रारंभ करता है

read()दूसरे शब्दों में, जब तक हम या जैसे तरीकों को कॉल करना शुरू नहीं करते हैं, तब तक स्ट्रीम पाइपलाइन के साथ डेटा की कोई आवाजाही नहीं होती है readLine()। धारा पाइपलाइन का मात्र निर्माण इसके माध्यम से डेटा नहीं चलाता है। धाराएँ स्वयं डेटा संग्रहीत नहीं करती हैं। वे केवल दूसरों से पढ़ते हैं।

संग्रह और धाराएँ

जावा 8 से शुरू होकर, संग्रह से डेटा पढ़ने के लिए एक धारा प्राप्त करना संभव हो गया (और न केवल उनसे)। लेकिन यह सबसे दिलचस्प बात नहीं है. डेटा स्ट्रीम की जटिल श्रृंखलाओं का आसानी से और आसानी से निर्माण करना वास्तव में संभव हो गया। और ऐसा करने में, कोड जो पहले 5-10 लाइन लेता था अब 1-2 लाइन में लिखा जा सकता है।

स्ट्रिंग्स की सूची में सबसे लंबी स्ट्रिंग खोजने का उदाहरण:

सबसे लंबी स्ट्रिंग ढूँढना
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max((s1, s2)-> s1.length()-s2.length()).get();
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> optional = stream.max((s1, s2)-> s1.length()-s2.length());
String max = optional.get();

3. Streamइंटरफ़ेस

स्ट्रीम के लिए जावा 8 का विस्तारित समर्थन Stream<T>इंटरफ़ेस का उपयोग करके लागू किया गया है, जहां Tएक प्रकार का पैरामीटर है जो स्ट्रीम में पारित होने वाले डेटा के प्रकार को इंगित करता है। दूसरे शब्दों में, एक धारा उस प्रकार के डेटा से पूरी तरह से स्वतंत्र होती है जो वह पास करता है।

संग्रह से स्ट्रीम ऑब्जेक्ट प्राप्त करने के लिए , बस इसकी stream()विधि को कॉल करें। कोड लगभग इस तरह दिखता है:

Stream<Type> name = collection.stream();
एक संग्रह से एक धारा प्राप्त करना

इस स्थिति में, संग्रह को स्ट्रीम का डेटा स्रोत माना जाएगा, और Stream<Type>ऑब्जेक्ट डेटा स्ट्रीम के रूप में संग्रह से डेटा प्राप्त करने का एक उपकरण होगा।

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();

वैसे, आप न केवल संग्रह से, बल्कि सरणियों से भी एक धारा प्राप्त कर सकते हैं । ऐसा करने के लिए, आपको विधि का उपयोग करने की आवश्यकता है। उदाहरण के लिए:Arrays.stream()

Stream<Type> name = Arrays.stream(array);
एक सरणी से एक धारा प्राप्त करना

इस स्थिति में, सरणी को उस स्ट्रीम के लिए डेटा स्रोत माना जाएगा जिसे कहा जाता है name

Integer[] array = {1, 2, 3};
Stream<Integer> stream = Arrays.stream(array);

Stream<Type>ऑब्जेक्ट बनाते समय कोई डेटा स्थानांतरित नहीं होता है । स्ट्रीम पाइपलाइन का निर्माण शुरू करने के लिए हमें बस एक स्ट्रीम ऑब्जेक्ट मिला।