2015-04-01 4 views
5

javadoc of Spliterator (जो क्या वास्तव में एक Stream अगर मैं चीजों को सही ढंग से समझ के पीछे है मूल रूप से है) कई characeristics जो समझ बनाने को परिभाषित करता है SIZED जैसे, CONCURRENT, IMMUTABLE आदिस्प्लिटरेटर <?> क्यों नॉननल को एक विशेषता के रूप में परिभाषित करता है?

लेकिन यह भी NONNULL परिभाषित करता है; क्यूं कर?

मैं होगा, हालांकि यह है कि यह है कि और सुनिश्चित करने के लिए उपयोगकर्ता की जिम्मेदारी होगी कि अगर, उदाहरण के लिए, एक डेवलपर .sort() एक गैर SORTED धारा जहां अशक्त तत्वों वह/वह हक एक एनपीई के साथ स्वागत किया जाएगा देखते हैं करने की कोशिश की ...

लेकिन फिर यह विशेषता मौजूद है। क्यूं कर? Spliterator ही की जावाडोक इसके बारे में किसी भी असली उपयोग का उल्लेख नहीं करता है और न java.util.stream पैकेज के package-info.java है ...

उत्तर

3

Spliterator के प्रलेखन से:

एक Spliterator भी ORDERED के बीच में से इसकी संरचना, स्रोत, और तत्वों का characteristics() का एक सेट की रिपोर्ट, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT , और SUBSIZED। इन्हें स्प्लिटरेटर क्लाइंट द्वारा गणना, विशेषज्ञता या गणना को सरल बनाने के लिए नियोजित किया जा सकता है।

ध्यान दें कि यह नहीं NullPointerException रों की रोकथाम का उल्लेख करता है। यदि आप Stream को सॉर्ट करते हैं जिसमें null मान हो सकते हैं तो Comparator प्रदान करने की आपकी ज़िम्मेदारी है जो null एस को संभाल सकता है।

दूसरी वाक्य यह भी स्पष्ट करती है कि इन झंडे का उपयोग केवल एक विकल्प है, "स्प्लिटरेटर क्लाइंट" की आवश्यकता नहीं है, जो Stream एस द्वारा उपयोग तक ही सीमित नहीं है।


तो चाहे वह Stream API के वर्तमान कार्यान्वयन द्वारा किया जाता है की परवाह किए बिना, वहाँ संभावनाओं के बारे में एक NONULL विशेषता ज्ञान का लाभ हासिल करने के लिए कर रहे हैं?

मुझे ऐसा लगता है। कुछ कार्यान्वयन के लिए null का उपयोग करने के लिए एक कार्यान्वयन गैर-nullSpliterator के लिए एक विशेष कोड पर शाखा हो सकता है, उदाहरण के लिए पहले तत्व को संसाधित करने से पहले अनुपस्थित मान या प्रारंभिक मान इत्यादि। यदि तथ्य है, Stream एस से निपटने के लिए वास्तविक कार्यान्वयन कोड जिसमें null जटिल हो सकता है। लेकिन निश्चित रूप से, आपको हमेशा वजन करना होगा कि एक मामले का सरलीकरण कोड डुप्लिकेशन को उचित ठहराता है या नहीं।

लेकिन कभी कभी सरलीकरण जानते हुए भी कोई null मूल्यों देखते हैं कि जितना आसान है मतलब है कि आप Concurrent… संग्रह है, जो null रों की अनुमति नहीं है, आंतरिक रूप से एक का उपयोग कर सकते हैं।

+0

हम्मवाइट ... क्या स्ट्रीम यहां प्राथमिक ग्राहक नहीं हैं? मैं शायद बहुत संकीर्ण दिमाग में हूं लेकिन मैं नहीं देखता कि आप अन्य ग्राहक क्या संभवतः तैयार कर सकते हैं। निश्चित रूप से, आप अपना खुद का कार्यान्वयन कर सकते हैं (मैंने ऐसा किया है), लेकिन इसे 'स्ट्रीम' में उपयोग करने के अलावा ... – fge

+1

"आप अपने स्वयं को लागू कर सकते हैं" एक मजबूत बिंदु नहीं है, अगर जावा के * बिंदु एपीआई, जो आपको पूर्ण अनुप्रयोग प्रदान करने के बजाय अपना स्वयं का आवेदन लिखने में सहायता करने के लिए है? इसके अलावा, 'स्ट्रीम प्राथमिक ग्राहक हैं, हां, लेकिन यह' स्ट्रीम 'के * वर्तमान कार्यान्वयन * तक ही सीमित नहीं है। भविष्य के संस्करण में एक नई विशेषता को जोड़ने के लिए एक बड़ी रिलीज की आवश्यकता होगी, लेकिन एक कार्यान्वयन जो पहले से मौजूद झंडे का उपयोग (बेहतर) उपयोग करता है, हर छोटे अपडेट में हो सकता है। इसलिए संभावित मूल्य के साथ जितनी जल्दी संभव हो सके झंडे जोड़ने की एक उचित रणनीति है। – Holger

+0

हां, मैं मानता हूं कि यह एक मजबूत बिंदु है; मुझे लगता है कि मैं इसके पीछे डिजाइन फैसलों के बारे में पर्याप्त जानकारी नहीं दे रहा हूं: / – fge

0

मैं enum StreamOpFlag के लिए कोड में निम्नलिखित टिप्पणी नहीं मिली।

// The following Spliterator characteristics are not currently used but a 
// gap in the bit set is deliberately retained to enable corresponding 
// stream flags if//when required without modification to other flag values. 
// 
// 4, 0x00000100 NONNULL(4, ... 
// 5, 0x00000400 IMMUTABLE(5, ... 
// 6, 0x00001000 CONCURRENT(6, ... 
// 7, 0x00004000 SUBSIZED(7, ... 
+0

उह, यहां तक ​​कि 'IMMUTABLE' और' CONCURRENT'? समांतरता का निर्धारण कैसे किया जाता है? जितना अधिक होगा, उतना ही मैं उलझन में हूं:/ – fge

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

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