1. तत्वों का संग्रह
अंत में, हम कक्षा में सबसे दिलचस्प विधि Stream
, collect()
विधि तक पहुँच गए हैं। इसका उपयोग स्ट्रीम से हमारे परिचित संग्रह — List<T>
, Set<T>
, Map<T, R>
और अन्य में ले जाने के लिए किया जाता है।
विधि collect()
एक विशेष collector
वस्तु को तर्क के रूप में लेती है। यह ऑब्जेक्ट स्ट्रीम से सभी डेटा को पढ़ता है, इसे एक विशिष्ट प्रकार के संग्रह में परिवर्तित करता है और इसे वापस करता है। और फिर संग्रह विधि ही इस संग्रह को लौटाती है।
यह सब एक चालाक तरीके से किया जाता है: collector
वस्तु का प्रकार है Collector<T, A, R>
। जैसा कि आप देख सकते हैं, इसमें तीन प्रकार के पैरामीटर हैं। अंतिम प्रकार का पैरामीटर ( R
) आमतौर पर एक प्रकार होता है List<T>
। इसका मतलब है कि कंपाइलर इस प्रकार का उपयोग collect()
विधि के लिए सही रिटर्न प्रकार निर्धारित करने के लिए कर सकता है।
मुझे उम्मीद है कि आप ज्यादा भ्रमित नहीं होंगे। किसी भी स्थिति में, आपको स्वयं संग्राहक वस्तुएँ बनाने की आवश्यकता नहीं है। वर्ग के स्थिर तरीकों द्वारा लौटाई गई तैयार वस्तुएँ Collectors
पर्याप्त होंगी।
कलेक्टर वर्ग
कक्षा Collectors
में कई स्थिर विधियाँ हैं जो तैयार संग्राहक वस्तुओं को लौटाती हैं - हर अवसर के लिए कुछ। यहां हम सबसे महत्वपूर्ण पर विचार करेंगे।
|
एक वस्तु जो धारा को सूची में परिवर्तित करती है ( List<T> ) |
|
एक वस्तु जो धारा को समुच्चय में परिवर्तित करती है ( Set<T> ) |
|
एक वस्तु जो धारा को मानचित्र में परिवर्तित करती है ( Map<K, V> ) |
|
स्ट्रीम के तत्वों को एक स्ट्रिंग में जोड़ता है |
|
स्ट्रिंग के तत्वों को a में कनवर्ट करता हैMap<K, V> |
|
तत्वों को समूहित करता है और रिटर्न करता हैMap<K, V> |
2. किसी स्ट्रीम को सूची में बदलना
निम्नलिखित धारा के साथ काम करने और परिणाम को सूची में बदलने का एक विशिष्ट उदाहरण है
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
List<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toList() );
हमें संग्रह से एक धारा मिली। तब हमें केवल उन स्ट्रिंग्स को बनाए रखते हुए एक नई धारा मिली जिसका पहला अक्षर अपरकेस है। फिर उस स्ट्रीम के सभी डेटा को एक संग्रह में एकत्रित किया जाता है, जिसे बाद में वापस कर दिया जाता है।
3. एक धारा को एक सेट में बदलना
निम्नलिखित एक धारा के साथ काम करने और परिणाम को एक सेट में बदलने का एक विशिष्ट उदाहरण है
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
Set<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toSet() );
स्ट्रीम को a में बदलने के लिए सब कुछ कोड के समान है List
, केवल हम एक अलग कलेक्टर ऑब्जेक्ट का उपयोग करते हैं, जो toSet()
विधि द्वारा वापस किया जाता है।
4. किसी धारा को मानचित्र में बदलना
लेकिन धारा को मानचित्र में बदलना थोड़ा अधिक कठिन है। मानचित्र में प्रत्येक प्रविष्टि में दो तत्व होते हैं: कुंजी और मान। हमें यह पता लगाने की आवश्यकता है कि हम धारा में प्रत्येक तत्व के लिए कुंजी और मान को कैसे परिभाषित करेंगे।
उदाहरण:
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
Map<String, String> result = list.stream()
.map( e -> e.split("=") )
.filter( e -> e.length == 2 )
.collect( Collectors.toMap(e -> e[0], e -> e[1]) );
आइए देखें कि यहां क्या हो रहा है।
पहली पंक्ति में, हम map(...)
प्रत्येक स्ट्रिंग को स्ट्रिंग्स की एक सरणी में बदलने के लिए उपयोग करते हैं। विभाजन विधि का उपयोग करते हुए, हम प्रत्येक स्ट्रिंग को दो भागों में विभाजित करते हैं।
दूसरी पंक्ति में, हम filter()
केवल उन सरणियों को पास करते हैं जिनमें ठीक दो तत्व होते हैं। स्ट्रिंग d==3
तीन तत्वों की एक सरणी में विभाजित हो जाती है, जो फ़िल्टर से मेल नहीं खाती।
और अंत में, अंतिम पंक्ति में, हम धारा को एक में परिवर्तित करते हैं Map<String, String>
। toMap()
विधि के लिए दो कार्य पारित किए जाते हैं । धारा के प्रत्येक तत्व के लिए, पहले फ़ंक्शन को कुंजी लौटानी चाहिए , और दूसरा मान लौटाता है ।
प्रत्येक सरणी का पहला तत्व ("ए", "बी", "सी") हमारी कुंजी होगी, और प्रत्येक सरणी का दूसरा तत्व ("2", "3", "4") हमारा मूल्य होगा।
5. स्ट्रीम को स्ट्रिंग में बदलना
एक और दिलचस्प संग्राहक वस्तु द्वारा लौटाया जाता है Collectors.joining()
। यह एक धारा के सभी तत्वों को परिवर्तित करता है String
और उन्हें एक स्ट्रिंग में जोड़ता है। उदाहरण
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );