क्यों Arrays.stream () द्वारा समर्थित नहीं हैं [[केवल एकमात्र सरणियाँ]


43

आदिम सरणियों को धाराओं में परिवर्तित करने के तरीकों से गुजरते हुए, मैंने पाया कि char[]समर्थित नहीं हैं जबकि अन्य आदिम सरणी प्रकार समर्थित हैं। उन्हें धारा में छोड़ने का कोई विशेष कारण?


3
stackoverflow.com/questions/22435833/… यह धागा IMO संबंधित प्रश्न को संबोधित करता है
मार्क ब्रैमनिक

जवाबों:


31

जैसा कि एरन ने कहा, यह केवल एक ही गायब नहीं है।

BooleanStreamबेकार होगा, ByteStream(यदि यह अस्तित्व में है) को एक के रूप में InputStreamया IntStream(के रूप में short) में परिवर्तित किया floatजा सकता है , और इसे एक के रूप में संभाला जा सकता है DoubleStream

जैसा कि charसभी पात्रों का प्रतिनिधित्व करने में सक्षम नहीं है (लिंक देखें), यह एक विरासत धारा का एक सा होगा । हालांकि अधिकांश लोगों को वैसे भी कोडपॉइंट्स से निपटने की ज़रूरत नहीं है, इसलिए यह अजीब लग सकता है। मेरा मतलब है कि आप String.charAt()बिना सोचे समझे "यह वास्तव में सभी मामलों में काम नहीं करता है"।

इसलिए कुछ चीजों को छोड़ दिया गया था क्योंकि उन्हें महत्वपूर्ण नहीं समझा गया था। जेबी निज़ेट द्वारा जुड़े सवाल में कहा गया है :

डिजाइनरों ने स्पष्ट रूप से 3 प्रकारों को आदिम धाराओं को सीमित करके कक्षाओं और विधियों के विस्फोट से बचने के लिए चुना, क्योंकि अन्य प्रकार (चार, लघु, फ्लोट) को किसी भी महत्वपूर्ण प्रदर्शन जुर्माना के बिना उनके बड़े समकक्ष (इंट, डबल) द्वारा दर्शाया जा सकता है।

इसका कारण BooleanStreamबेकार होगा, ऐसा इसलिए है क्योंकि आपके पास केवल 2 मूल्य हैं और यह संचालन को बहुत सीमित करता है। ऐसा करने के लिए कोई गणितीय कार्य नहीं है, और आप कितनी भी बार बूलियन मूल्यों के साथ काम कर रहे हैं?


7
" BooleanStreamबेकार होगा": क्यों?
Glglgl

12
यह करने के लिए, जैसे की जरूरत सकता है वास्तव में किसी को ग्रहण करने के लिए अनुचित है reduce(Boolean::logicalAnd)या reduce(Boolean::logicalOr), एक पर boolean[]? आखिरकार, तरीकों logicalAndऔर logicalOrजावा 8 में जोड़ दिया गया है, इसलिए मैं इन कमी के संचालन को कर सकता हूं Stream<Boolean>... वैसे, आप एक char[]आसान के रूप में स्ट्रीम कर सकते हैं CharBuffer.wrap(array).chars()या CharBuffer.wrap(array).codePoints(), जिस शब्दार्थ को आप पसंद करते हैं।
होल्गर

2
@ होलियर Boolean::logicalAndमौजूद होने के कारण , यह जरूरी नहीं है कि अस्तित्व का कोई वारंट न हो BooleanStream। उन सभी के बाद गैर-स्ट्रीम लैम्ब्डा स्थितियों में उपयोग किया जा सकता है। मैं कल्पना कर सकते हैं कि किसी को होगा चाहते करने के लिए reduce(Boolean::logicalAnd)है, लेकिन किसी भी मामले में किसी को भी करता है की जरूरत है यह करने के लिए।
कयामन

4
मैं नहीं देखता कि आप क्या तर्क देने की कोशिश कर रहे हैं। अपने चरम रूप में: "मैं सोच सकता हूं कि कोई ऐसा करना चाहेगा while (i < limit), लेकिन किसी भी मामले में किसी को भी ऐसा करने की आवश्यकता नहीं है [शाखा का उपयोग करने और विधानसभा निर्देशों को कूदने के लिए]"
अलेक्जेंडर - मोनिका

11
यह मुझे लगता है कि <Primitive>Streamहर आदिम प्रकार के लिए कोई एकमात्र कारण नहीं है क्योंकि यह एपीआई को बहुत अधिक फूला देगा। पूछने के लिए सही सवाल यह है कि "आखिर ऐसा क्यों है IntStream?" और दुर्भाग्यपूर्ण जवाब है क्योंकि जावा के प्रकार प्रणाली Stream<int>का उपयोग करने के प्रदर्शन के खर्च के बिना व्यक्त करने के लिए पर्याप्त रूप से बाहर fleshed नहीं है Integer। यदि जावा में वैल्यू टाइप्स होते हैं, जो स्टैक पर आवंटित किए जा सकते हैं या अन्य डेटा संरचनाओं के भीतर सीधे इन-लाइन एम्बेड किए जा सकते हैं, तो इसके अलावा किसी भी चीज की कोई आवश्यकता नहीं होगीStream<T>
अलेक्जेंडर - मोनिका

32

बेशक, जवाब "है, क्योंकि डिजाइनरों ने यह तय किया है "। कोई तकनीकी कारण CharStreamनहीं है कि मौजूद क्यों नहीं हो सकता।

यदि आप औचित्य चाहते हैं, तो आपको आमतौर पर OpenJDK मेलिंग सूची * को चालू करना होगा। JDK के दस्तावेज़ को न्यायोचित ठहरा करने की आदत नहीं है यही कारण है कि कुछ भी वजह है कि यह है।

किसी ने पूछा

चार / बाइट स्ट्रीम का प्रतिनिधित्व करने के लिए IntStream का उपयोग करना थोड़ा असुविधाजनक है। क्या हमें चारस्ट्रीम और बाइटस्ट्रीम को भी जोड़ना चाहिए?

ब्रायन गोएत्ज़ (जावा लैंग्वेज आर्किटेक्ट) का जवाब कहता है

संक्षिप्त उत्तर: नहीं।

यह इन रूपों के लिए प्रत्येक JDK पदचिह्न का एक और 100K + लायक नहीं है जो लगभग कभी नहीं उपयोग किए जाते हैं। और अगर हम उन लोगों को जोड़ते हैं, तो कोई कम, फ्लोट या बूलियन की मांग करेगा।

एक और तरीका रखो, अगर लोग जोर देते हैं कि हमारे पास सभी आदिम विशेषज्ञताएं हैं, तो हमारे पास कोई आदिम विशेषज्ञता नहीं होगी। जो यथास्थिति से भी बदतर होगी।

स्रोत

वह अन्यत्र भी यही कहता है

यदि आप उनसे चार्ट के रूप में निपटना चाहते हैं, तो आप उन्हें आसानी से पर्याप्त चार्ट में बदल सकते हैं। ऐसा लगता नहीं है कि एक महत्वपूर्ण पर्याप्त उपयोग के मामले में धाराओं का एक पूरा सेट है। (शॉर्ट, बाइट, फ्लोट के साथ भी)।

स्रोत

टीएल; डीआर: रखरखाव लागत के लायक नहीं है।


* यदि आप उत्सुक हैं, तो मेरे द्वारा उपयोग की गई Google क्वेरी थी

site:http://mail.openjdk.java.net/ charstream

2
क्या कोई स्पष्ट कर सकता है कि उनका क्या मतलब है 100K+ of JDK footprint?
यस

3
@ हत्यारे को किसी को कोड लिखना होगा। वह अनुमान लगा रहा है कि धारा की प्रत्येक विशेषज्ञता 100,000 से अधिक लाइनों की कोड है
माइकल

3
@BulgarSadykov " एक्स की तरह वाई क्यों है " के बारे में ऐसे सवाल अक्सर राय-आधारित के रूप में बंद होते हैं क्योंकि मूल लेखक के दिमाग को पढ़ना असंभव है और, जब तक कि वे दिखाने के लिए नहीं होते हैं, तब तक आपको प्राप्त होने वाले सभी अनुमान हैं। यदि मैं पूछता हूं कि "मैं अपाचे के HTTP क्लाइंट के साथ POST अनुरोध कैसे भेजूं?", तो पुस्तकालय से परिचित कोई भी व्यक्ति इसका उत्तर दे सकता है। क्यों एक पुस्तकालय डिजाइन किया जाता है जिस तरह से यह आमतौर पर जवाब देने के लिए असंभव है। केवल कारण है कि हम इस जवाब देने में सक्षम हैं वास्तव में उनकी बातचीत का एक सार्वजनिक रिकॉर्ड है, क्योंकि वहाँ है। यही मैं पहले वाक्य के साथ पाने की कोशिश कर रहा था।
माइकल

2
@BulgarSadykov यह भी याद दिलाता है, सी # के बारे में एरिक लिपर्ट के ब्लॉग का उल्लेख करता है, लेकिन "क्यों भाषा में फू सुविधा लागू नहीं होती है" के विषय पर " stackoverflow.com/a/5588850/479871
Pac0

2
@BulgarSadykov सम्मानपूर्वक असहमत। फिर, मैं अपने उदाहरण के सवाल को दोहराता हूं कि " मैं अपाचे के HTTP क्लाइंट के साथ एक POST अनुरोध कैसे भेजूं? "। उस प्रश्न का उत्तर स्पष्ट रूप से " क्योंकि डिजाइनरों ने तय किया है " से शुरू नहीं होता है । मैं शब्दशः नहीं बदल रहा, क्षमा करें।
माइकल

7

यह न केवल charसरणियाँ हैं जो समर्थित नहीं हैं।

वहाँ आदिम धाराओं का केवल 3 प्रकार के होते हैं - IntStream, LongStreamऔर DoubleStream

परिणामस्वरूप, Arraysऐसी विधियाँ हैं जो रूपांतरित होती हैं int[], long[]और double[]इसी आदिम धाराओं में।

वहाँ के लिए कोई इसी तरीके हैं boolean[], byte[], short[], char[]और float[], के बाद से इन आदिम प्रकार कोई आदिम धाराओं इसी है।


4
"चूंकि इन आदिम प्रकारों में कोई भी आदिम धारा नहीं है।" फिर फॉलोअप सवाल "क्यों" होगा?
फेडेरिको क्लेज़ कुल्लोक

7
@FedericoklezCulloca कि फॉलोअप प्रश्न का उत्तर यहां दिया गया है
एरन

6

charStringUTF-16 मानों के भंडारण का एक आश्रित हिस्सा है । एक यूनिकोड प्रतीक, एक कोड बिंदु , कभी-कभी एक सरोगेट जोड़ी का वर्ण होता है। तो चार्ट के साथ कोई भी सरल समाधान केवल यूनिकोड डोमेन के हिस्से को कवर करता है।

एक समय charथा कि एक सार्वजनिक प्रकार होने का अपना अधिकार था। लेकिन आजकल कोड पॉइंट का उपयोग करना बेहतर है , ए IntStream। सर की एक धारा सीधे सरोगेट जोड़े को संभाल नहीं सकती थी।

अन्य अधिक सामान्य कारण यह है कि JVM "प्रोसेसर" मॉडल एक intछोटे से "रजिस्टर" के रूप में उपयोग करता है , जो बूलियन, बाइट्स, शॉर्ट्स और साथ ही इस तरह के अंतर भंडारण स्थान में चार्ट रखता है। जरूरी नहीं कि जावा क्लासेस को ब्लॉट किया जाए, जो सभी संभव कॉपी वेरिएंट से परहेज करें।

में अब तक भविष्य एक आदिम प्रकार सामान्य प्रकार पैरामीटर के रूप में कार्य करने की अनुमति दी उम्मीद कर सकते हैं, एक प्रदान List<int>। तब हम देख सकते हैं a Stream<char>

पल के लिए बेहतर से बचें char, और शायद java.text.Normalizerकोड अंक / यूनिकोड स्ट्रिंग्स के एक अद्वितीय विहित रूप के लिए उपयोग करें ।

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