1. Java मधील नवकल्पना 8: कार्यात्मक प्रोग्रामिंग

Java 8 च्या रिलीझसह, भाषेला कार्यात्मक प्रोग्रामिंगसाठी शक्तिशाली समर्थन प्राप्त झाले . तुम्ही असेही म्हणू शकता की याने फंक्शनल प्रोग्रामिंगसाठी दीर्घ-प्रतीक्षित समर्थन मिळवले आहे. कोडिंग अधिक जलद झाले, जरी कोड वाचणे अधिक कठीण होते 🙂

Java मध्ये फंक्शनल प्रोग्रामिंग शिकण्यापूर्वी , आम्ही शिफारस करतो की तुम्ही तीन गोष्टी चांगल्या प्रकारे समजून घ्या:

  1. OOP, वारसा आणि इंटरफेस ( Java Core क्वेस्ट मधील स्तर 1-2 ).
  2. इंटरफेसमध्ये डीफॉल्ट पद्धत अंमलबजावणी .
  3. अंतर्गत आणि निनावी वर्ग .

चांगली बातमी अशी आहे की Java मध्ये फंक्शनल प्रोग्रामिंगची अनेक वैशिष्ट्ये वापरण्यासाठी तुम्हाला हे सर्व माहित असणे आवश्यक नाही. वाईट बातमी अशी आहे की निनावी आतील वर्गांबद्दल जाणून घेतल्याशिवाय सर्वकाही कसे व्यवस्थित केले जाते आणि सर्वकाही कसे कार्य करते हे समजून घेणे कठीण होईल.

आगामी धड्यांमध्ये, आम्ही Java च्या कार्यात्मक प्रोग्रामिंग वैशिष्ट्यांचा वापर करणे किती सोपे आणि सोपे आहे यावर लक्ष केंद्रित करू, ते कसे कार्य करते याचे सखोल आकलन न करता.

Java मधील फंक्शनल प्रोग्रामिंगच्या सर्व बारकावे समजून घेण्यासाठी काही महिने लागतात. तुम्ही काही तासांत असा कोड वाचायला शिकू शकता. म्हणून आम्ही लहान सुरुवात करण्याचा सल्ला देतो. जरी ते 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(). स्ट्रीम पाइपलाइनचे केवळ बांधकाम त्याद्वारे डेटा चालवित नाही. प्रवाह स्वतःच डेटा संचयित करत नाहीत. ते फक्त इतरांकडून वाचतात.

संग्रह आणि प्रवाह

Java 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इंटरफेस

प्रवाहासाठी Java 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>ऑब्जेक्ट तयार केल्यावर कोणताही डेटा हलविला जात नाही . स्ट्रीम पाइपलाइन बांधणे सुरू करण्यासाठी आम्हाला फक्त एक स्ट्रीम ऑब्जेक्ट मिळाला.