जावा 8: आलसी कार्यों के लिए एपीआई में धाराओं को पास करने के लिए अच्छा अभ्यास?


12

अमरूद जैसे प्री-जावा 8 लैम्ब्डा-हेवी लाइब्रेरी में, आउटपुट सामान्य जावा कलेक्शन फ्रेमवर्क इंटरफेस का उपयोग करते हैं, इसलिए उन्हें बाहरी / आंतरिक एपीआई के आसपास पास करना आसान होता है और फिर भी लाइब्रेरी विधि (जैसे आलसी filter()और transform()) होने पर कुछ आलसी कम्प्यूटेशन का उपयोग करते हैं ।

हालाँकि, जावा 8 स्ट्रीम में, कॉल करने के लिए Collection/ a Mapटर्मिनल (यानी उत्सुक) है और यह परिणामों को धारण करने के लिए नए डेटा संरचनाओं को भी आवंटित करेगा।

बीच में कई चरणों और रणनीति पैटर्न के साथ जटिल संगणना के लिए, यह मध्यवर्ती परिणामों के कारण बहुत सारे अनावश्यक आवंटन का कारण बनता है।

तो, क्या लोगों को लगता है कि आंतरिक एपीआई (यानी स्ट्रेटेजी पैटर्न स्ट्रेटेजी) के लिए एक अच्छा अभ्यास है और Streamएस वापस लेने के लिए या क्या मुझे सिर्फ आलसी के लिए कमबैक करना चाहिए, लेकिन सुव्यवस्थित नहीं (दंड का इरादा मुझे लगता है) अमरूद एपीआई?

संपादित करें:

इसके साथ मेरी मुख्य चिंता Streamयह है कि इसे केवल एक बार ही सेवन किया जा सकता है और यह Supplier<Stream<X>>बेहद खौफनाक लगता है। यह लगभग आपको केवल एक Collectionऔर फिर से पास करने के लिए धक्का देता stream()है (और उस बिंदु पर उत्सुक मूल्यांकन की लागत का भुगतान)।


देशी धाराओं का लाभ उठाने के लिए क्या, अमरूद और दोस्तों को अपडेट नहीं किया जा रहा है?
किलिअन फोथ

1
स्ट्रीम लेने और वापस करने वाले इंटरफेस में वास्तव में मानक स्ट्रीम फ़ंक्शंस के साथ इंटरऑपरेबिलिटी में सुधार होता है। यह आपको एक स्ट्रीम पाइपलाइन में अपने इंटरफ़ेस पर कॉल को एकीकृत करने की अनुमति देता है।
फिलिप

@KilianFoth लगभग एक साल से कोई अमरूद रिलीज़ नहीं हुआ है और स्ट्रीम के साथ अमरूद के लैंबड़ा सामान को बदलने के बारे में कई लोकप्रिय लेख हैं; हालांकि, उनमें से कोई भी इस तथ्य को संबोधित नहीं करता है कि अमरूद संग्रह संचालन उत्सुक या आलसी हो सकता है।
बिल.क।

जवाबों:


3

जावा 8 धाराओं में आलस्य उसी तरह काम करता है जैसा कि अमरूद में Iterables के लिए किया जाता था: आपको आलसी बने रहने के लिए Iterable पर गुजरना पड़ता है और मूल्यांकन तब होता है, जब आप Iterator से एक संग्रह बनाते हैं। धाराओं और Iterators दोनों का केवल एक बार सेवन किया जा सकता है।

तो आपके विधि इंटरफेस के लिए, अधिक सामान्य तरीका (आलस्य को अनुमति देना) स्ट्रीम इंटरफ़ेस का उपयोग करना है (जब भी आप पहले Iterable का उपयोग किया होगा)। जैसा कि @ फीलिप कहता है, यह उन्हें स्ट्रीम पाइपलाइन में उपयोग करने की अनुमति देता है।

उम्मीद है, चूंकि स्ट्रीम अब एक आधिकारिक जावा मानक इंटरफ़ेस है, इसलिए अधिक से अधिक अन्य पुस्तकालय और फ़ंक्शन होंगे जो कुशलता से सीधे स्ट्रीम पर काम कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.