दिलचस्प पोस्ट
मैं स्ट्रिंग कैसे कर सकता हूँ। .NET में एक कस्टम प्रारूप के साथ एक टाइमस्पैन ऑब्जेक्ट फॉर्मेट करें? ओसीआर और चरित्र समानता <Blink> के लिए वैकल्पिक मैं C ++ कंटेनर में भिन्न प्रकार के ऑब्जेक्ट कैसे स्टोर कर सकता हूं? बाइट सरणी को स्ट्रिंग (जावा) में परिवर्तित करना जावा में पूर्णांक में दोहरे कास्ट करें मैं एक ऐसी तालिका के लिए एसक्यूएल कैसे लिख सकता हूँ जो MySQL में संरक्षित कीवर्ड के समान नाम को साझा करता है? डिस्प्ले का उपयोग करने के लाभ: इनलाइन-ब्लॉक बनाम फ्लोट: सीएसएस में छोड़ दिया क्लासपाथ से फाइल इंस्टेंस के रूप में लोड करने / संदर्भ कैसे करें सी # 'गतिशील' अन्य विधानसभा में घोषित गुमनाम प्रकार से संपत्तियों तक नहीं पहुंच सकता है ValueTypes ऑब्जेक्ट (संदर्भ प्रकार) से कैसे प्राप्त करते हैं और अभी भी ValueTypes हैं? Django में विदेशी कुंजी ऑब्जेक्ट Serializing लिनक्स में आईफोन ऐप डेवलपमेंट शुरू करना? दो स्थानों या साधारण पूर्णांक तक दशमलव दिखाने के लिए स्ट्रिंग फ़ॉर्मेट का उपयोग करना जावास्क्रिप्ट / jQuery चेक टूटी लिंक्स

क्यों नहीं java.util.Collection नए स्ट्रीम इंटरफ़ेस को लागू करता है?

मैं धाराओं और लैम्ब्दास के बारे में जावा -8 चर्चा की तलाश शुरू करने के लिए कुछ समय लगा। मुझे आश्चर्य है कि आप स्ट्रीम ऑपरेशन्स को लागू नहीं कर सकते हैं, जैसे .filter() , .filter() सीधे java.util.Collection । क्या कोई तकनीकी कारण है कि java.util.Collection अंतरफलक इन स्ट्रीम कार्यों के डिफ़ॉल्ट कार्यान्वयन के साथ विस्तारित नहीं किया गया था?

थोड़ा सा Googling, मैं के पैटर्न के साथ कोडिंग लोगों के बहुत सारे उदाहरण देखें:

 List<String> list = someListExpression; List<String> anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList()); 

जो बहुत अजीब हो जाता है, यदि आपके पास इन कोडों में से बहुत सारे स्ट्रीम-ऑपरेशन हैं चूंकि। .stream() और .collect() पूरी तरह से अप्रासंगिक हैं जो आप व्यक्त करना चाहते हैं, आप यह कहना चाहेंगे:

 List<String> list = someListExpression; List<String> anotherList = list.map(x -> f(x)); 

वेब के समाधान से एकत्रित समाधान "क्यों नहीं java.util.Collection नए स्ट्रीम इंटरफ़ेस को लागू करता है?"

हां, इन निर्णयों के लिए उत्कृष्ट कारण हैं 🙂

कुंजी उत्सुक और आलसी आपरेशनों के बीच का अंतर है। आपके द्वारा दिए गए उदाहरणों में पहला सवाल दिखाते हैं कि सूची में मानचित्रण या फ़िल्टर करने से एक नई सूची उत्पन्न होती है। इस के साथ कुछ भी गलत नहीं है, लेकिन अक्सर वह नहीं होता है जो आप चाहते हैं, क्योंकि आप अक्सर जरूरत से ज्यादा काम कर रहे हैं; एक उत्सुक ऑपरेशन को प्रत्येक तत्व पर कार्य करना चाहिए और एक नया संग्रह तैयार करना होगा। यदि आप कई ऑपरेशन (फिल्टर-नक्शा-कम) लिख रहे हैं, तो आप बहुत अधिक अतिरिक्त कार्य कर रहे हैं दूसरी ओर, आलसी आपरेशनों को खूबसूरती से लिखना; यदि तुम करो:

  Optional<Person> tallestGuy = people.stream() .filter(p -> p.getGender() == MALE) .max(comparing(Person::getHeight)); 

फिल्टर और कम (अधिकतम) आपरेशन एक साथ एक पास में जुड़े हुए हैं I यह बहुत ही कुशल है

तो, क्यों नहीं सूची के अधिकार पर धारा के तरीकों को बेनकाब करें? खैर, हम इसे इस तरह से कोशिश कर रहे थे। कई अन्य कारणों के अलावा, हमने पाया कि आलसी तरीकों को filter() जैसे और removeAll() जैसे उत्सुक तरीके उपयोगकर्ताओं को भ्रमित कर रहे थे। आलसी तरीकों को एक अलग पृथक्करण में समूहबद्ध करके, यह बहुत स्पष्ट हो जाता है; List पर विधियां उन सूची को बदल देती हैं; Stream पर विधियां उन हैं जो डेटा दृश्यों पर संगत, आलसी परिचालनों में सौदा करते हैं, भले ही उस डेटा के जीवन की परवाह किए बिना।

इसलिए, जिस तरह से आप यह सुझाव देते हैं कि यह वास्तव में सरल चीजें करना चाहते हैं, लेकिन जब आप उस पर निर्माण करने की कोशिश करते हैं तो इससे अलग होना शुरू हो जाता है। अतिरिक्त stream() विधि कष्टप्रद है? ज़रूर। लेकिन डेटा संरचनाओं (जो मोटे तौर पर स्मृति में डेटा व्यवस्थित करने के बारे में हैं) और धाराओं (जो बड़े पैमाने पर कुल व्यवहार बनाते हैं) के लिए पृथक्करण को रखते हुए अलग परिष्कृत परिचालनों के लिए अलग-अलग तराजू बेहतर बनाते हैं।

अपने दूसरे प्रश्न के लिए, आप यह अपेक्षाकृत आसानी से कर सकते हैं: इस तरह से धारा के तरीकों को लागू करें:

 public<U> Stream<U> map(Function<T,U> mapper) { return convertToStream().map(mapper); } 

लेकिन यह सिर्फ ज्वार के खिलाफ तैर रहा है; बस एक कुशल धारा () विधि को लागू करने के लिए बेहतर है