5

Stream इंटरफ़ेस में of() विधि के लिए दो ओवरलोड हैं। इनमें से एक एक चर-धर्मार्थ विधि है जबकि दूसरा एक तर्क लेता है।जावा स्ट्रीम इंटरफ़ेस में() के varargs विधि को अधिभार क्यों अधिभारित करें?

एकल-तर्क विधि एक प्रदर्शन अनुकूलन बनाम चर-ध्रुवीय विधि के लिए एक तर्क पारित कर रहा है? यदि हां, तो यह प्रदर्शन में सुधार कैसे करता है? empty() विधि से भी वही प्रश्न पूछे जा सकते हैं, जो वैरिएबल-आर्टी of() के आसपास वाक्यविन्यास चीनी प्रतीत होता है।

मुझे लगता है कि कार्यान्वयन इन विधियों के बीच भिन्न है, अंतर यह है कि Spliterator तत्काल है; लेकिन Stream एपीआई को यह प्रस्ताव क्या लाभ देता है?

उत्तर

5

हां, यह केवल एक ही तत्व को पकड़ने के लिए सरणी बनाने के ओवरहेड से बचने के लिए एक अनुकूलन है, जो कि अगर आप varargs संस्करण का उपयोग करते हैं तो आपको वह मिल जाएगा।

एक ही सवाल खाली() विधि है, जो()

क्या कार्यान्वयन संस्करण के चर-arity आप देख रहे हैं चारों ओर वाक्य रचना चीनी होने लगते हैं के लिए कहा जा सकता है? जब मैं कार्यान्वयन को देखता हूं तो मुझे यह नहीं दिखाई देता है।

+0

मेरा मतलब केवल यह था कि विधि हस्ताक्षर वाक्यविन्यास चीनी को इंगित करने लगते हैं (और दस्तावेज़ीकरण एक तरफ या दूसरे को इंगित नहीं करता है)। मैं देखता हूं कि कार्यान्वयन अलग हैं। – jaco0646

+0

एकल तत्व या खाली सरणी का बचाव माइक्रो-ऑप्टिमाइज़ेशन जैसा लगता है। क्या इस तरह की चीज एक औसत डेवलपर के बारे में चिंतित होना चाहिए? क्या मुझे अपने सभी varargs विधियों के लिए इस प्रकार के प्रदर्शन अनुकूलन प्रदान करना चाहिए? – jaco0646

+1

@ jaco0646, वाक्यविन्यास चीनी के साथ क्या गलत है? विशेष रूप से यदि यह प्रदर्शन अनुकूलन अवसर भी प्रदान करता है। –

5

खाली स्ट्रीम और एकल तत्व धारा बहुत आम उपयोग-मामलों हैं, खासकर जब आप .flatMap() का उपयोग करते हैं। उदाहरण के लिए, यहाँ कैसे Optional.stream() जावा-9 में implemented है:

public Stream<T> stream() { 
    if (!isPresent()) { 
     return Stream.empty(); 
    } else { 
     return Stream.of(value); 
    } 
} 

तो Optionals की धारा को देखते हुए आप उन्हें फ्लैट धारा में इस तरह से खोलने कर सकते हैं:

streamOfOptionals.flatMap(Optional::stream); 

यहाँ आप खाली की टन बनाने धाराओं के साथ-साथ एकल तत्व धाराएं, इसलिए ऐसे मामलों को अनुकूलित करना बहुत उचित लगता है। विशेष रूप से, Stream.empty()Stream.of() के विपरीत एक खाली सरणी नहीं बनाता है और स्प्लिटरेटर नहीं बनाता है (यह वही स्प्लिटरेटर उदाहरण का उपयोग करता है)। Stream.of(T) को विशेष रूप से StreamBuilderImpl के अंदर भी अनुकूलित किया गया है, इसलिए एकल तत्व के लिए कोई सरणी आवंटित नहीं की जाती है।

1

मैंने एक आधिकारिक संसाधन में ठोकर खाई है जो इस प्रश्न के पिछले उत्तरों की पुष्टि करता है: JEP 269: Convenience Factory Methods for Collections। उस प्रस्ताव का विवरण,

उन संग्रहों की unmodifiable उदाहरणों बनाने के लिए List, Set, और Map इंटरफेस पर स्थिर कारखाने तरीकों प्रदान करने के लिए है।

इसमें varargs अधिभार शामिल होंगे, ताकि संग्रह आकार पर कोई निश्चित सीमा न हो ... विशेष तत्व API (निश्चित-तर्क ओवरलोड) दस तत्वों के लिए प्रदान किए जाएंगे। हालांकि यह एपीआई में कुछ अव्यवस्था प्रस्तुत करता है, यह सर आवंटन, प्रारंभिकरण, और कचरा संग्रहण ओवरहेड से बचाता है जो varargs कॉल द्वारा किया जाता है।

तो प्रदर्शन अनुकूलन एक varargs विधि की सरणी से बचने के लिए काफी सरल है।

संबंधित मुद्दे