में मैंने हाल ही में जावा 8 में स्ट्रीम के बारे में सीखा और उनके साथ काम करना शुरू कर दिया। अब मैं groupingBy
कलेक्टर विधि से संबंधित प्रश्न है:जावा 8 ग्रुपिंग पेक
आमतौर पर मैं नेट के साथ काम करते हैं, तो मैं तुलना में (यह जानकर वे कर रहे हैं नहीं ही) नेट IEnumerable<T>
साथ जावा Stream<T>
। इस तुलना के बाद, List<T>
स्टोर तत्वों और विशेष Stream
/IEnumerable
संचालन लागू करता है। एक उदाहरण:
सी #:
elements.Where(x => x.Value == 5).ToList();
जावा:
elements.stream().filter(x -> x.getValue() == 5).collect(Collectors.toList());
दोनों उदाहरणों में, मैं एक सूची के साथ शुरू, संचालन (इस उदाहरण में एक फिल्टर) को परिभाषित करने और स्टोर करने के लिए परिणाम इकट्ठा यह (इस उदाहरण में एक नई सूची में)।
data.stream()
.map(...).filter(...) // Some operations
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)));
इस क्वेरी के परिणाम एक Map<String, Long>
है और मैं इस के साथ काम कर सकते हैं, लेकिन कहते हैं कि, मैं इसे भंडारण के बजाय इस डेटा के साथ आगे बढ़ना चाहते हैं कर सकते हैं:
अब मैं एक अधिक जटिल मामला मिला है। मेरे वर्तमान दृष्टिकोण तुच्छ है:
...
.collect(groupingBy(Chunk::getName, summingLong(Chunk::getValue)))
.entrySet().stream().
.map(...) // Do more operations
लेकिन इस तरह से, मैं धारा छोड़ देते हैं, एक मानचित्र में पहला परिणाम की दुकान और जारी रखने के लिए एक नई धारा को खोलें। क्या कलेक्टर के बिना समूह करने का कोई तरीका है, ताकि मैं स्ट्रीम में "रह सकूं"?
चूंकि आप समूह कर रहे हैं, तो आपको बहुत से मध्यवर्ती स्टोर में जाना होगा - क्या होगा यदि आपको अंत में मूल्य के साथ स्ट्रीम की शुरुआत में मूल्य को समूहित करने की आवश्यकता है? आपको "सबकुछ" संसाधित करने की आवश्यकता होगी, इसे तब तक संग्रहित करना होगा जब तक आप सुनिश्चित न हों कि समूह के साथ कुछ और नहीं है। तो आंतरिक रूप से, जावा को (/??) चीजों को एक मानचित्र (या कुछ समान संरचना) में रखना होगा; यह खुद करने के बारे में इतना बुरा क्या है? –
यह वास्तव में कोई समस्या नहीं है, मैं अपने छोटे दृष्टिकोण के साथ रह सकता हूं, लेकिन मेरे सभी अन्य धारा संचालनों में 'सूची' रखने और 'स्ट्रीम' रखने के बीच एक स्पष्ट रेखा थी। मैंने इसे खोल दिया, उस पर संचालित किया और इसे इकट्ठा किया। अब एक नक्शा है, जो एक नई धारा के लिए खोला जाता है, इसलिए मैं सोच रहा था कि क्या यह किसी अन्य दृष्टिकोण के साथ संभव है। –
शायद मैं अपने .NET पृष्ठभूमि से भ्रमित हो गया। वहां आप 'IENumerable' पर कोई भी ऑपरेशन कर सकते हैं और अंत में आप अपना परिणाम' ToList', 'ToArray',' ToDictionary' या इसके ऊपर फिर से भरकर एकत्रित कर सकते हैं। –