1. जाँच करना
मुझे लगता है कि आप पहले से ही डेटा स्ट्रीम को एक साथ चेन करने के तरीके सीखने से ऊब गए होंगे। आप अंततः डेटा के साथ कुछ करना चाहते हैं।
कक्षा Streamमें तीन मानक विधियाँ हैं जो धाराएँ नहीं बनाती हैं, बल्कि जाँचती हैं कि उनमें किस प्रकार का डेटा है। ये विधियां हैं: anyMatch(), allMatch(), और noneMatch().
boolean anyMatch(rule)तरीका
यह विधि जाँचती है कि क्या धारा में कम से कम एक तत्व है जो विधि को पारित नियम को संतुष्ट करता है। यदि ऐसा कोई तत्व है, तो विधि वापस आ जाती है true, अन्यथा false।
उदाहरण
| कोड | टिप्पणी |
|---|---|
|
|
|
|
|
|
पिछले उदाहरण में, हम पहले केवल उन तत्वों को रखते हैं जो शून्य से कम हैं, और फिर हम यह देखने के लिए परिणाम की जांच करते हैं कि फ़िल्टर किए गए तत्वों में से कोई भी शून्य से अधिक है या नहीं। बेशक, ऐसे तत्व अब नहीं हैं।
बूलियन ऑलमैच (नियम) विधि
यह विधि जाँचती है कि धारा में सभी तत्व नियम से मेल खाते हैं (जिसे विधेय के रूप में भी जाना जाता है)। नियम विधि के तर्क के रूप में पारित किया गया है:
| कोड | टिप्पणी |
|---|---|
|
(शून्य से अधिक सभी तत्व) |
|
(क्या शून्य से कम या उसके बराबर तत्व हैं?) |
|
(हमने उन तत्वों को बरकरार रखा है जो शून्य से कम हैं) |
पिछले उदाहरण में, हम पहले केवल उन तत्वों को फ़िल्टर के माध्यम से पारित करने की अनुमति देते हैं जो शून्य से कम हैं, और फिर हम जांचते हैं कि सभी बनाए गए तत्व शून्य से कम हैं या नहीं। चेक एक सकारात्मक परिणाम देता है।
बूलियन नोमैच (नियम) विधि
विधि noneMatch()जाँचती है कि क्या धारा में कोई तत्व नहीं है जो पारित नियम से मेल खाता हो। यह विधि के विपरीत जैसा है anyMatch()।
| कोड | टिप्पणी |
|---|---|
|
|
|
|
|
|
2. उपयोगिता वर्ग: Optionalवर्ग
nullकभी-कभी प्रोग्रामर के लिए संदर्भों के साथ काम करना बहुत असुविधाजनक होता है । उदाहरण के लिए, मान लीजिए कि आप दो तारों की तुलना कर रहे हैं। यदि दोनों चर नहीं हैं null, तो आप बस कॉल कर सकते हैं s1.equals(s2), और सब कुछ काम करेगा। लेकिन अगर s1हो सकता है null, तो आपको एक से बचने के लिए कोड लिखना होगा जो इस स्थिति को संभालता है NullPointerException।
इसलिए प्रोग्रामर Optional<T>यूटिलिटी क्लास लेकर आए। इसका कोड मोटे तौर पर इस तरह दिखता है:
| कोड | टिप्पणी |
|---|---|
|
जाँचता है कि क्या मान नहीं है null जाँचता है कि क्या मान null संग्रहीत मान लौटाता है। यदि मान शून्य है तो अपवाद फेंकता है। संग्रहीत गैर-शून्य मान लौटाता है। या यदि संग्रहीत मान है null, तो एक विधि तर्क के रूप में पारित मान लौटाता है संग्रहीत गैर-शून्य मान लौटाता है या मान शून्य होने पर अपवाद फेंकता है। |
इस वर्ग का उद्देश्य केवल एक टी ऑब्जेक्ट (किसी ऑब्जेक्ट का संदर्भ जिसका प्रकार टी है) को स्टोर करना है। Optional<T>किसी वस्तु के अंदर वस्तु संदर्भ हो सकता है null।
यह वर्ग प्रोग्रामरों को थोड़ा सुंदर कोड लिखने देता है। आइए तुलना करें:
| वैकल्पिक का उपयोग करना | वैकल्पिक का उपयोग नहीं करना |
|---|---|
|
|
विधि का उपयोग करके एक Optionalवस्तु की तुलना हमेशा दूसरी Optionalवस्तु से की जा सकती है equals, भले ही वे nullसंदर्भों को संग्रहीत करते हों।
सीधे शब्दों में कहें, तो Optionalकक्षा आपको "सुंदर" चेक लिखने देती है nullऔर "सुंदर" क्रियाएं उस घटना में लिखती है जब कोई Optionalऑब्जेक्ट एक nullमान संग्रहीत करता है।
3. तत्वों का पता लगाना
चलिए Streamकक्षा में वापस आते हैं। कक्षा Streamमें 4 और विधियाँ हैं जो आपको एक धारा में तत्वों की खोज करने देती हैं। ये तरीके हैं findFirst(), findAny(), min(), और max().
Optional<T> findFirst()तरीका
विधि findFirst()केवल धारा में पहला तत्व लौटाती है। बस इतना ही करता है।
यहां ध्यान देने वाली अधिक दिलचस्प बात यह है कि यह विधि किसी वस्तु को वापस नहीं करती है T, बल्कि एक Optional<T>आवरण वस्तु है। nullयह सुनिश्चित करता है कि किसी वस्तु को खोजने में विफल होने के बाद विधि कभी वापस नहीं आएगी ।
उदाहरण:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello
अधिक स्पष्टता के लिए, आइए अंतिम पंक्ति को कई पंक्तियों में विभाजित करें:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello
अंतिम विधि केवल वस्तु के get()अंदर संग्रहीत मान को पुनः प्राप्त करती है ।Optional
Optional<T> findAny()तरीका
विधि findAny()किसी भी तत्व को धारा से लौटाती है और वहीं समाप्त होती है। यह विधि समान है findFirst(), लेकिन यह समानांतर संचालन में उपयोग की जाने वाली धाराओं के लिए बहुत अच्छी है।
समानांतर में धाराओं को संसाधित करते समय, यह हो सकता है कि धारा के कुछ हिस्से में पहले से ही एक तत्व पाया गया हो, लेकिन यह अभी तक स्पष्ट नहीं है कि यह पहला है या नहीं।
यदि कई तत्व सभी फ़िल्टर से मेल खाते हैं, और प्रोग्रामर के लिए उनमें से सबसे पहले प्राप्त करना महत्वपूर्ण है, तो विधि वह findFirst()है जिसे कहा जाना चाहिए। यदि प्रोग्रामर जानता है कि वास्तव में 0 या 1 तत्व सभी फ़िल्टर से मेल खाएगा, तो यह केवल कॉल करने के लिए पर्याप्त है findAny()- और यह तेज़ होगा।
Optional<T> min(Comparator<T>)तरीका
विधि धारा में सभी तत्वों की तुलना करने के लिए min()एक वस्तु का उपयोग करती है और न्यूनतम तत्व लौटाती है। comparatorएक तुलनित्र वस्तु को परिभाषित करने का सबसे सुविधाजनक तरीका लैम्ब्डा फ़ंक्शन है।
सबसे छोटी स्ट्रिंग खोजने का उदाहरण:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();
Optional<T> max(Comparator<T>)तरीका
विधि धारा में सभी तत्वों की तुलना करने के लिए max()एक वस्तु का उपयोग करती है और अधिकतम तत्व लौटाती है। comparatorएक तुलनित्र वस्तु को परिभाषित करने का सबसे सुविधाजनक तरीका लैम्ब्डा फ़ंक्शन है।
सबसे लंबी स्ट्रिंग की खोज का उदाहरण:
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();
GO TO FULL VERSION