চরের [] একমাত্র অ্যারেগুলি অ্যারেস্ট্রিম () দ্বারা সমর্থনযোগ্য নয় কেন?


43

আদিম অ্যারেগুলিকে স্ট্রিমগুলিতে রূপান্তর করার উপায়গুলি অতিক্রম করার সময় আমি দেখতে পেলাম যে char[]অন্যান্য আদিম অ্যারে প্রকারগুলি সমর্থিত হওয়ার সময় সমর্থিত নয়। এগুলি স্রোতে রেখে যাওয়ার কোনও বিশেষ কারণ?


3
stackoverflow.com/questions/22435833/… এই থ্রেড আইএমও একটি সম্পর্কিত প্রশ্ন সম্বোধন করে
মার্ক ব্রামনিক

উত্তর:


31

ইরান যেমন বলেছিল, এটি কেবলমাত্র নিখোঁজ নয়।

BooleanStreamঅকেজো হবে, এ ByteStream(যদি এটি বিদ্যমান থাকে) একটি হিসাবে পরিচালনা করা যায় InputStreamবা রূপান্তরিত হতে পারে IntStream(হিসাবে পারে short), এবং এ floatহিসাবে পরিচালনা করা যায় DoubleStream

যেভাবে charযাইহোক সমস্ত অক্ষর উপস্থাপন করতে সক্ষম নয় (লিঙ্কযুক্ত দেখুন), এটি কিছুটা উত্তরাধিকারের স্ট্রিম হবে। যদিও বেশিরভাগ লোককে যাইহোক কোডপয়েন্টগুলি নিয়ে কাজ করতে হবে না, তাই এটি আশ্চর্যজনক বলে মনে হতে পারে। আমার অর্থ আপনি String.charAt()চিন্তা না করেই ব্যবহার করেন "এটি আসলে সব ক্ষেত্রে কাজ করে না"।

সুতরাং কিছু বিষয় বাদ দেওয়া হয়েছিল কারণ সেগুলি এটিকে গুরুত্বপূর্ণ বলে মনে করা হয়নি। হিসাবে মধ্যে JB Nizet বলেছেন লিঙ্ক প্রশ্ন :

ডিজাইনাররা স্পষ্টভাবে ক্লাস এবং পদ্ধতির বিস্ফোরণ এড়ানোর জন্য বেছে নিয়েছিল আদিম ধারাগুলি 3 প্রকারের মধ্যে সীমাবদ্ধ রেখে, যেহেতু অন্যান্য ধরণের (চর, সংক্ষিপ্ত, ভাসমান) কোনও উল্লেখযোগ্য পারফরম্যান্স জরিমানা ছাড়াই তাদের বৃহত্তর সমতুল্য (ইনট, ডাবল) দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

কারণটি BooleanStreamঅকেজো হবে, কারণ আপনার কেবল দুটি মান রয়েছে এবং এটি অপারেশনগুলিকে অনেক সীমাবদ্ধ করে। কোনও গাণিতিক ক্রিয়াকলাপ নেই, এবং আপনি যেভাবে বুলিয়ান প্রচুর মান নিয়ে কতবার কাজ করছেন?


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), তবে কোনও অবস্থাতেই [শাখা এবং জামিল সমাবেশের নির্দেশাবলী ব্যবহার করে] কাউকে এটি করার দরকার নেই "
আলেকজান্ডার - মনিকা 18

11
আমার কাছে মনে হচ্ছে <Primitive>Streamপ্রতিটি আদিম ধরণের কোনও কারণ নেই কারণ এটি এপিআইকে খুব বেশি প্রসারণ করবে। জিজ্ঞাসা করার সঠিক প্রশ্নটি হ'ল "কেন আছে IntStream, আদৌ আছে ?" এবং দুর্ভাগ্যজনক উত্তরটি হ'ল জাভা টাইপ সিস্টেমটি Stream<int>ব্যবহারের সমস্ত পারফরম্যান্স ব্যয় ছাড়াই প্রকাশ করার মতো যথেষ্ট পরিমাণে ছড়িয়ে পড়ে নি Integer। জাভাতে যদি মান ধরণের থাকে, যা স্ট্যাকের জন্য বরাদ্দ করা যেতে পারে বা অন্যান্য ডেটা স্ট্রাকচারের মধ্যে সরাসরি লাইন এম্বেড করা যেতে পারে, তবে এ ছাড়া আর কোনও কিছুর প্রয়োজন পড়বে নাStream<T>
আলেকজান্ডার -

32

অবশ্যই, উত্তরটি " কারণ এটিই ডিজাইনাররা সিদ্ধান্ত নিয়েছিলেন "। কেন CharStreamঅস্তিত্ব থাকতে পারে তার কোনও প্রযুক্তিগত কারণ নেই।

আপনি যদি ন্যায়সঙ্গততা চান তবে আপনার সাধারণত ওপেনজেডিকে মেলিং তালিকা * চালু করতে হবে। JDK এর ডকুমেন্টেশন justifying অভ্যাস নয় কেন কিছু কেন এটা।

কেউ জিজ্ঞাসা করলেন

চর / বাইট স্ট্রিম উপস্থাপন করতে ইন্টস্ট্রিম ব্যবহার করা কিছুটা অসুবিধাজনক। আমাদের পাশাপাশি চারস্ট্রিম এবং বাইটস্ট্রিম যুক্ত করা উচিত?

ব্রায়ান গয়েটজ (জাভা ল্যাঙ্গুয়েজ আর্কিটেক্ট) এর উত্তর বলেছে

সংক্ষিপ্ত উত্তর: না।

এই ফর্মগুলির জন্য প্রতিটি জেডিকে পদক্ষেপের জন্য আরও 100 কে + মূল্যবান নয় যা প্রায়শই ব্যবহৃত হয় না। এবং যদি আমরা সেগুলি যুক্ত করি, তবে কেউ ছোট, ভাসমান বা বুলিয়ান দাবি করবে demand

আরেকটি উপায় রাখুন, লোকেরা যদি জোর দিয়েছিল যে আমাদের সমস্ত আদিম বিশেষত্ব রয়েছে, তবে আমাদের কোনও আদিম বিশেষত্ব থাকবে না। যা স্থিতাবস্থার চেয়েও খারাপ হবে।

সূত্র

তিনি অন্যত্রও একই কথা বলেন

আপনি যদি তাদের সাথে চর হিসাবে ডিল করতে চান, আপনি সহজেই যথেষ্ট পরিমাণে তাদের এড়িয়ে যেতে পারেন। স্ট্রিমের পুরো 'নোটার সেট' রাখার জন্য যথেষ্ট গুরুত্বপূর্ণ ব্যবহারের ক্ষেত্রে মনে হচ্ছে না। (শর্ট, বাইট, ফ্লোট সহ একই)।

সূত্র

টিএল; ডিআর: রক্ষণাবেক্ষণ ব্যয়ের পক্ষে মূল্য নেই।


* আপনি যদি কৌতূহলী হন তবে আমার ব্যবহৃত গুগল কোয়েরিটি ছিল

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

2
তাদের বলতে কী বোঝাতে পারে কেউ ব্যাখ্যা করতে পারে 100K+ of JDK footprint?
ইয়াসিন

3
@ ইয়াসিন কাউকে কোড লিখতে হবে। তিনি অনুমান করছেন যে স্ট্রিমের প্রতিটি বিশেষীকরণ কোডের 100,000 লাইনেরও বেশি
মাইকেল

3
@ বালগারস্যাডকোভ " এক্স কেন ওয়াই এর মত " এই জাতীয় প্রশ্নগুলি প্রায়শই মতামত ভিত্তিক হিসাবে বন্ধ হয়ে যায় কারণ মূল লেখকের মন পড়া অসম্ভব এবং যদি না দেখা যায় তবে আপনি সমস্তই অনুমানযোগ্য হবেন। যদি আমি জিজ্ঞাসা করি "আমি কীভাবে আপাচের এইচটিটিপি ক্লায়েন্টের সাথে একটি পোষ্ট অনুরোধ পাঠাব?", গ্রন্থাগারের সাথে পরিচিত যে কেউ এর উত্তর দিতে পারে। লাইব্রেরিটি কেন এমনভাবে তৈরি করা হয়েছে তা উত্তর দেওয়া অসম্ভব। একমাত্র কারণ আমরা এই উত্তর দিতে সক্ষম হয় সত্যিই তাদের কথোপকথনের একটি পাবলিক রেকর্ড কারণ নেই। এটিই আমি প্রথম বাক্যটি দিয়ে পাওয়ার চেষ্টা করছিলাম।
মাইকেল

2
@BulgarSadykov এটি এই কথা মনে করিয়ে দেয় উল্লেখ এরিক Lippert এর ব্লগ প্রায় সি #, কিন্তু "কেন ফু বৈশিষ্ট্য ভাষায় বাস্তবায়িত হয়নি" বিষয়ে stackoverflow.com/a/5588850/479251
Pac0

2
@ বালগারাসাদিভক শ্রদ্ধার সাথে একমত নন। আবার, আমি "উদাহরণস্বরূপ আমি কিভাবে অ্যাপাচের এইচটিটিপি ক্লায়েন্টের সাথে একটি পোষ্ট অনুরোধ পাঠাব? " এর আমার উদাহরণের পুনরাবৃত্তি করি । এই প্রশ্নের উত্তর পরিষ্কারভাবে শুরু হয় না " কারণ এটিই ডিজাইনাররা সিদ্ধান্ত নিয়েছিলেন "। আমি শব্দ পরিবর্তন করছি না, দুঃখিত।
মাইকেল

7

এটি কেবল charঅ্যারেগুলিই সমর্থিত নয়।

সেখানে আদিম প্রবাহের মাত্র 3 ধরনের হয় - IntStream, LongStreamএবং DoubleStream

ফলস্বরূপ, Arraysপদ্ধতি রূপান্তর হয়েছে int[], long[]এবং double[]সংশ্লিষ্ট আদিম স্ট্রিম।

এটির জন্য কোনো সংশ্লিষ্ট পদ্ধতি boolean[], byte[], short[], char[]এবং float[], যেহেতু এই আদিম ধরনের কোন আদিম স্ট্রিম সংশ্লিষ্ট হয়েছে।


4
"যেহেতু এই আদিম ধরণের কোনও সম্পর্কিত আদিম ধারা নেই" " তাহলে ফলোআপ প্রশ্নটি "কেন" হবে?
ফেডেরিকো ক্লেজ কুলোকা

7
যে ফলোআপ প্রশ্ন @FedericoklezCulloca উত্তর এখানে
Eran

6

charএর নির্ভরশীল অংশ String- ইউটিএফ -16 মান সংরক্ষণ করা। একটি ইউনিকোড প্রতীক, একটি কোড পয়েন্ট , কখনও কখনও চরগুলির একটি সারোগেট জোড়া হয়। সুতরাং চরগুলি সহ যে কোনও সাধারণ সমাধান কেবল ইউনিকোড ডোমেনের কিছু অংশ জুড়ে।

এমন একটি সময় charছিল যা সর্বজনীন ধরণের হওয়ার নিজস্ব অধিকার ছিল। তবে আজকাল কোড পয়েন্ট ব্যবহার করা ভাল , এ IntStream। চরের একটি স্ট্রিম সোজাভাবে সরোগেট জোড়গুলি পরিচালনা করতে পারে না।

অন্য প্রসেসিক কারণ হ'ল জেভিএম "প্রসেসর" মডেলটি একটি intছোট আকারের "রেজিস্টার" ব্যবহার করে, বুলেয়েনস, বাইটস, শর্টস এবং এই জাতীয় কোনও আকারের স্টোরেজ অবস্থানে অক্ষর রাখে। অগত্যা জাভা ক্লাসগুলি ফুটিয়ে তোলার জন্য, সমস্ত সম্ভাব্য অনুলিপি বৈকল্পিক থেকে বিরত থাকে।

ইন সুদূর ভবিষ্যতে এক আদিম ধরনের জেনেরিক টাইপ প্যারামিটার হিসেবে ফাংশন করার অনুমতি দেওয়া আশা করতে পারে, একটি প্রদানের List<int>। তারপরে আমরা একটি দেখতে পাব Stream<char>

মুহুর্তের জন্য আরও ভাল এড়ানো charএবং সম্ভবত java.text.Normalizerকোড পয়েন্ট / ইউনিকোড স্ট্রিংগুলির একটি অনন্য ক্যানোনিকাল ফর্মের জন্য ব্যবহার করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.