आदिम सरणियों को धाराओं में परिवर्तित करने के तरीकों से गुजरते हुए, मैंने पाया कि char[]
समर्थित नहीं हैं जबकि अन्य आदिम सरणी प्रकार समर्थित हैं। उन्हें धारा में छोड़ने का कोई विशेष कारण?
आदिम सरणियों को धाराओं में परिवर्तित करने के तरीकों से गुजरते हुए, मैंने पाया कि char[]
समर्थित नहीं हैं जबकि अन्य आदिम सरणी प्रकार समर्थित हैं। उन्हें धारा में छोड़ने का कोई विशेष कारण?
जवाबों:
जैसा कि एरन ने कहा, यह केवल एक ही गायब नहीं है।
ए BooleanStream
बेकार होगा, ByteStream
(यदि यह अस्तित्व में है) को एक के रूप में InputStream
या IntStream
(के रूप में short
) में परिवर्तित किया float
जा सकता है , और इसे एक के रूप में संभाला जा सकता है DoubleStream
।
जैसा कि char
सभी पात्रों का प्रतिनिधित्व करने में सक्षम नहीं है (लिंक देखें), यह एक विरासत धारा का एक सा होगा । हालांकि अधिकांश लोगों को वैसे भी कोडपॉइंट्स से निपटने की ज़रूरत नहीं है, इसलिए यह अजीब लग सकता है। मेरा मतलब है कि आप String.charAt()
बिना सोचे समझे "यह वास्तव में सभी मामलों में काम नहीं करता है"।
इसलिए कुछ चीजों को छोड़ दिया गया था क्योंकि उन्हें महत्वपूर्ण नहीं समझा गया था। जेबी निज़ेट द्वारा जुड़े सवाल में कहा गया है :
डिजाइनरों ने स्पष्ट रूप से 3 प्रकारों को आदिम धाराओं को सीमित करके कक्षाओं और विधियों के विस्फोट से बचने के लिए चुना, क्योंकि अन्य प्रकार (चार, लघु, फ्लोट) को किसी भी महत्वपूर्ण प्रदर्शन जुर्माना के बिना उनके बड़े समकक्ष (इंट, डबल) द्वारा दर्शाया जा सकता है।
इसका कारण BooleanStream
बेकार होगा, ऐसा इसलिए है क्योंकि आपके पास केवल 2 मूल्य हैं और यह संचालन को बहुत सीमित करता है। ऐसा करने के लिए कोई गणितीय कार्य नहीं है, और आप कितनी भी बार बूलियन मूल्यों के साथ काम कर रहे हैं?
BooleanStream
बेकार होगा": क्यों?
reduce(Boolean::logicalAnd)
या reduce(Boolean::logicalOr)
, एक पर boolean[]
? आखिरकार, तरीकों logicalAnd
और logicalOr
जावा 8 में जोड़ दिया गया है, इसलिए मैं इन कमी के संचालन को कर सकता हूं Stream<Boolean>
... वैसे, आप एक char[]
आसान के रूप में स्ट्रीम कर सकते हैं CharBuffer.wrap(array).chars()
या CharBuffer.wrap(array).codePoints()
, जिस शब्दार्थ को आप पसंद करते हैं।
Boolean::logicalAnd
मौजूद होने के कारण , यह जरूरी नहीं है कि अस्तित्व का कोई वारंट न हो BooleanStream
। उन सभी के बाद गैर-स्ट्रीम लैम्ब्डा स्थितियों में उपयोग किया जा सकता है। मैं कल्पना कर सकते हैं कि किसी को होगा चाहते करने के लिए reduce(Boolean::logicalAnd)
है, लेकिन किसी भी मामले में किसी को भी करता है की जरूरत है यह करने के लिए।
while (i < limit)
, लेकिन किसी भी मामले में किसी को भी ऐसा करने की आवश्यकता नहीं है [शाखा का उपयोग करने और विधानसभा निर्देशों को कूदने के लिए]"
<Primitive>Stream
हर आदिम प्रकार के लिए कोई एकमात्र कारण नहीं है क्योंकि यह एपीआई को बहुत अधिक फूला देगा। पूछने के लिए सही सवाल यह है कि "आखिर ऐसा क्यों है IntStream
?" और दुर्भाग्यपूर्ण जवाब है क्योंकि जावा के प्रकार प्रणाली Stream<int>
का उपयोग करने के प्रदर्शन के खर्च के बिना व्यक्त करने के लिए पर्याप्त रूप से बाहर fleshed नहीं है Integer
। यदि जावा में वैल्यू टाइप्स होते हैं, जो स्टैक पर आवंटित किए जा सकते हैं या अन्य डेटा संरचनाओं के भीतर सीधे इन-लाइन एम्बेड किए जा सकते हैं, तो इसके अलावा किसी भी चीज की कोई आवश्यकता नहीं होगीStream<T>
बेशक, जवाब "है, क्योंकि डिजाइनरों ने यह तय किया है "। कोई तकनीकी कारण CharStream
नहीं है कि मौजूद क्यों नहीं हो सकता।
यदि आप औचित्य चाहते हैं, तो आपको आमतौर पर OpenJDK मेलिंग सूची * को चालू करना होगा। JDK के दस्तावेज़ को न्यायोचित ठहरा करने की आदत नहीं है यही कारण है कि कुछ भी वजह है कि यह है।
किसी ने पूछा
चार / बाइट स्ट्रीम का प्रतिनिधित्व करने के लिए IntStream का उपयोग करना थोड़ा असुविधाजनक है। क्या हमें चारस्ट्रीम और बाइटस्ट्रीम को भी जोड़ना चाहिए?
ब्रायन गोएत्ज़ (जावा लैंग्वेज आर्किटेक्ट) का जवाब कहता है
संक्षिप्त उत्तर: नहीं।
यह इन रूपों के लिए प्रत्येक JDK पदचिह्न का एक और 100K + लायक नहीं है जो लगभग कभी नहीं उपयोग किए जाते हैं। और अगर हम उन लोगों को जोड़ते हैं, तो कोई कम, फ्लोट या बूलियन की मांग करेगा।
एक और तरीका रखो, अगर लोग जोर देते हैं कि हमारे पास सभी आदिम विशेषज्ञताएं हैं, तो हमारे पास कोई आदिम विशेषज्ञता नहीं होगी। जो यथास्थिति से भी बदतर होगी।
वह अन्यत्र भी यही कहता है
यदि आप उनसे चार्ट के रूप में निपटना चाहते हैं, तो आप उन्हें आसानी से पर्याप्त चार्ट में बदल सकते हैं। ऐसा लगता नहीं है कि एक महत्वपूर्ण पर्याप्त उपयोग के मामले में धाराओं का एक पूरा सेट है। (शॉर्ट, बाइट, फ्लोट के साथ भी)।
टीएल; डीआर: रखरखाव लागत के लायक नहीं है।
* यदि आप उत्सुक हैं, तो मेरे द्वारा उपयोग की गई Google क्वेरी थी
site:http://mail.openjdk.java.net/ charstream
100K+ of JDK footprint
?
यह न केवल char
सरणियाँ हैं जो समर्थित नहीं हैं।
वहाँ आदिम धाराओं का केवल 3 प्रकार के होते हैं - IntStream
, LongStream
और DoubleStream
।
परिणामस्वरूप, Arrays
ऐसी विधियाँ हैं जो रूपांतरित होती हैं int[]
, long[]
और double[]
इसी आदिम धाराओं में।
वहाँ के लिए कोई इसी तरीके हैं boolean[]
, byte[]
, short[]
, char[]
और float[]
, के बाद से इन आदिम प्रकार कोई आदिम धाराओं इसी है।
char
String
UTF-16 मानों के भंडारण का एक आश्रित हिस्सा है । एक यूनिकोड प्रतीक, एक कोड बिंदु , कभी-कभी एक सरोगेट जोड़ी का वर्ण होता है। तो चार्ट के साथ कोई भी सरल समाधान केवल यूनिकोड डोमेन के हिस्से को कवर करता है।
एक समय char
था कि एक सार्वजनिक प्रकार होने का अपना अधिकार था। लेकिन आजकल कोड पॉइंट का उपयोग करना बेहतर है , ए IntStream
। सर की एक धारा सीधे सरोगेट जोड़े को संभाल नहीं सकती थी।
अन्य अधिक सामान्य कारण यह है कि JVM "प्रोसेसर" मॉडल एक int
छोटे से "रजिस्टर" के रूप में उपयोग करता है , जो बूलियन, बाइट्स, शॉर्ट्स और साथ ही इस तरह के अंतर भंडारण स्थान में चार्ट रखता है। जरूरी नहीं कि जावा क्लासेस को ब्लॉट किया जाए, जो सभी संभव कॉपी वेरिएंट से परहेज करें।
में अब तक भविष्य एक आदिम प्रकार सामान्य प्रकार पैरामीटर के रूप में कार्य करने की अनुमति दी उम्मीद कर सकते हैं, एक प्रदान List<int>
। तब हम देख सकते हैं a Stream<char>
।
पल के लिए बेहतर से बचें char
, और शायद java.text.Normalizer
कोड अंक / यूनिकोड स्ट्रिंग्स के एक अद्वितीय विहित रूप के लिए उपयोग करें ।