আদিম অ্যারেগুলিকে স্ট্রিমগুলিতে রূপান্তর করার উপায়গুলি অতিক্রম করার সময় আমি দেখতে পেলাম যে char[]অন্যান্য আদিম অ্যারে প্রকারগুলি সমর্থিত হওয়ার সময় সমর্থিত নয়। এগুলি স্রোতে রেখে যাওয়ার কোনও বিশেষ কারণ?
আদিম অ্যারেগুলিকে স্ট্রিমগুলিতে রূপান্তর করার উপায়গুলি অতিক্রম করার সময় আমি দেখতে পেলাম যে char[]অন্যান্য আদিম অ্যারে প্রকারগুলি সমর্থিত হওয়ার সময় সমর্থিত নয়। এগুলি স্রোতে রেখে যাওয়ার কোনও বিশেষ কারণ?
উত্তর:
ইরান যেমন বলেছিল, এটি কেবলমাত্র নিখোঁজ নয়।
এ BooleanStreamঅকেজো হবে, এ ByteStream(যদি এটি বিদ্যমান থাকে) একটি হিসাবে পরিচালনা করা যায় InputStreamবা রূপান্তরিত হতে পারে IntStream(হিসাবে পারে short), এবং এ floatহিসাবে পরিচালনা করা যায় DoubleStream।
যেভাবে charযাইহোক সমস্ত অক্ষর উপস্থাপন করতে সক্ষম নয় (লিঙ্কযুক্ত দেখুন), এটি কিছুটা উত্তরাধিকারের স্ট্রিম হবে। যদিও বেশিরভাগ লোককে যাইহোক কোডপয়েন্টগুলি নিয়ে কাজ করতে হবে না, তাই এটি আশ্চর্যজনক বলে মনে হতে পারে। আমার অর্থ আপনি String.charAt()চিন্তা না করেই ব্যবহার করেন "এটি আসলে সব ক্ষেত্রে কাজ করে না"।
সুতরাং কিছু বিষয় বাদ দেওয়া হয়েছিল কারণ সেগুলি এটিকে গুরুত্বপূর্ণ বলে মনে করা হয়নি। হিসাবে মধ্যে JB Nizet বলেছেন লিঙ্ক প্রশ্ন :
ডিজাইনাররা স্পষ্টভাবে ক্লাস এবং পদ্ধতির বিস্ফোরণ এড়ানোর জন্য বেছে নিয়েছিল আদিম ধারাগুলি 3 প্রকারের মধ্যে সীমাবদ্ধ রেখে, যেহেতু অন্যান্য ধরণের (চর, সংক্ষিপ্ত, ভাসমান) কোনও উল্লেখযোগ্য পারফরম্যান্স জরিমানা ছাড়াই তাদের বৃহত্তর সমতুল্য (ইনট, ডাবল) দ্বারা প্রতিনিধিত্ব করা যেতে পারে।
কারণটি BooleanStreamঅকেজো হবে, কারণ আপনার কেবল দুটি মান রয়েছে এবং এটি অপারেশনগুলিকে অনেক সীমাবদ্ধ করে। কোনও গাণিতিক ক্রিয়াকলাপ নেই, এবং আপনি যেভাবে বুলিয়ান প্রচুর মান নিয়ে কতবার কাজ করছেন?
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>ব্যবহারের সমস্ত পারফরম্যান্স ব্যয় ছাড়াই প্রকাশ করার মতো যথেষ্ট পরিমাণে ছড়িয়ে পড়ে নি Integer। জাভাতে যদি মান ধরণের থাকে, যা স্ট্যাকের জন্য বরাদ্দ করা যেতে পারে বা অন্যান্য ডেটা স্ট্রাকচারের মধ্যে সরাসরি লাইন এম্বেড করা যেতে পারে, তবে এ ছাড়া আর কোনও কিছুর প্রয়োজন পড়বে নাStream<T>
অবশ্যই, উত্তরটি " কারণ এটিই ডিজাইনাররা সিদ্ধান্ত নিয়েছিলেন "। কেন CharStreamঅস্তিত্ব থাকতে পারে তার কোনও প্রযুক্তিগত কারণ নেই।
আপনি যদি ন্যায়সঙ্গততা চান তবে আপনার সাধারণত ওপেনজেডিকে মেলিং তালিকা * চালু করতে হবে। JDK এর ডকুমেন্টেশন justifying অভ্যাস নয় কেন কিছু কেন এটা।
কেউ জিজ্ঞাসা করলেন
চর / বাইট স্ট্রিম উপস্থাপন করতে ইন্টস্ট্রিম ব্যবহার করা কিছুটা অসুবিধাজনক। আমাদের পাশাপাশি চারস্ট্রিম এবং বাইটস্ট্রিম যুক্ত করা উচিত?
ব্রায়ান গয়েটজ (জাভা ল্যাঙ্গুয়েজ আর্কিটেক্ট) এর উত্তর বলেছে
সংক্ষিপ্ত উত্তর: না।
এই ফর্মগুলির জন্য প্রতিটি জেডিকে পদক্ষেপের জন্য আরও 100 কে + মূল্যবান নয় যা প্রায়শই ব্যবহৃত হয় না। এবং যদি আমরা সেগুলি যুক্ত করি, তবে কেউ ছোট, ভাসমান বা বুলিয়ান দাবি করবে demand
আরেকটি উপায় রাখুন, লোকেরা যদি জোর দিয়েছিল যে আমাদের সমস্ত আদিম বিশেষত্ব রয়েছে, তবে আমাদের কোনও আদিম বিশেষত্ব থাকবে না। যা স্থিতাবস্থার চেয়েও খারাপ হবে।
তিনি অন্যত্রও একই কথা বলেন
আপনি যদি তাদের সাথে চর হিসাবে ডিল করতে চান, আপনি সহজেই যথেষ্ট পরিমাণে তাদের এড়িয়ে যেতে পারেন। স্ট্রিমের পুরো 'নোটার সেট' রাখার জন্য যথেষ্ট গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে মনে হচ্ছে না। (শর্ট, বাইট, ফ্লোট সহ একই)।
টিএল; ডিআর: রক্ষণাবেক্ষণ ব্যয়ের পক্ষে মূল্য নেই।
* আপনি যদি কৌতূহলী হন তবে আমার ব্যবহৃত গুগল কোয়েরিটি ছিল
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- ইউটিএফ -16 মান সংরক্ষণ করা। একটি ইউনিকোড প্রতীক, একটি কোড পয়েন্ট , কখনও কখনও চরগুলির একটি সারোগেট জোড়া হয়। সুতরাং চরগুলি সহ যে কোনও সাধারণ সমাধান কেবল ইউনিকোড ডোমেনের কিছু অংশ জুড়ে।
এমন একটি সময় charছিল যা সর্বজনীন ধরণের হওয়ার নিজস্ব অধিকার ছিল। তবে আজকাল কোড পয়েন্ট ব্যবহার করা ভাল , এ IntStream। চরের একটি স্ট্রিম সোজাভাবে সরোগেট জোড়গুলি পরিচালনা করতে পারে না।
অন্য প্রসেসিক কারণ হ'ল জেভিএম "প্রসেসর" মডেলটি একটি intছোট আকারের "রেজিস্টার" ব্যবহার করে, বুলেয়েনস, বাইটস, শর্টস এবং এই জাতীয় কোনও আকারের স্টোরেজ অবস্থানে অক্ষর রাখে। অগত্যা জাভা ক্লাসগুলি ফুটিয়ে তোলার জন্য, সমস্ত সম্ভাব্য অনুলিপি বৈকল্পিক থেকে বিরত থাকে।
ইন সুদূর ভবিষ্যতে এক আদিম ধরনের জেনেরিক টাইপ প্যারামিটার হিসেবে ফাংশন করার অনুমতি দেওয়া আশা করতে পারে, একটি প্রদানের List<int>। তারপরে আমরা একটি দেখতে পাব Stream<char>।
মুহুর্তের জন্য আরও ভাল এড়ানো charএবং সম্ভবত java.text.Normalizerকোড পয়েন্ট / ইউনিকোড স্ট্রিংগুলির একটি অনন্য ক্যানোনিকাল ফর্মের জন্য ব্যবহার করুন ।