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();