java - জাভা 8-তে, কোনও বাইট স্ট্রিম শ্রেণি নেই?




java-8 byte (2)

না, এর অস্তিত্ব নেই। প্রকৃতপক্ষে, স্ট্রিম এপিআই যাতে প্রতিটি আদিম ধরণের শ্রেণির জন্য প্রচুর ক্লাস না হয় তা স্পষ্টভাবে বাস্তবায়িত হয়নি।

ওপেনজেডিকে মেলিং তালিকায় ব্রায়ান গয়েটসের একটি মেল উদ্ধৃত করা:

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

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

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

জাভা 8 IntStream Stream<T> IntStream , IntStream এবং LongStream IntStream : double Stream<T> , IntStream এবং LongStream । তবে ডকুমেন্টেশনে byte সমতুল্য আমি খুঁজে পাইনি byte

জাভা 8 কি ByteStream ক্লাস সরবরাহ করে?


বাইট-সম্পর্কিত বেশিরভাগ অপারেশন স্বয়ংক্রিয়ভাবে ইনট এ প্রচারিত হয়। উদাহরণস্বরূপ, আসুন সেই সহজ পদ্ধতিটি বিবেচনা করুন যা byte প্রতিটি উপাদানকে একটি byte ধ্রুবক যুক্ত করে byte[] অ্যারে ফিরছে নতুন byte[] অ্যারে ( ByteStream সম্ভাব্য প্রার্থী):

public static byte[] add(byte[] arr, byte addend) {
    byte[] result = new byte[arr.length];
    int i=0;
    for(byte b : arr) {
        result[i++] = (byte) (b+addend);
    }
    return result;
}

দেখুন, যদিও আমরা দুটি byte ভেরিয়েবলের সংযোজন সম্পাদন করি তবে সেগুলি প্রসারিত হয় এবং আপনাকে ফলাফলটি byte । জাভা বাইটকোডে byte রিলেটেড অপারেশনগুলির বেশিরভাগ (অ্যারে লোড / স্টোর এবং বাইটে কাস্ট করা ব্যতীত) 32-বিট পূর্ণসংখ্যার নির্দেশাবলী ( iadd , ixor , if_icmple এবং আরও) দিয়ে প্রকাশ করা হয়। সুতরাং ব্যবহারিকভাবে এটি IntStream সাথে IntStream হিসাবে বাইটগুলি প্রক্রিয়া করা ঠিক। আমাদের কেবল দুটি অতিরিক্ত অপারেশন দরকার:

  • byte[] অ্যারে থেকে একটি IntStream তৈরি করুন (বাইটগুলি IntStream প্রসারিত করা)
  • byte[] করার জন্য একটি IntStream সংগ্রহ করুন byte[] অ্যারে ( (byte) কাস্ট ব্যবহার করে)

প্রথমটি সত্যিই সহজ এবং এর মতো প্রয়োগ করা যেতে পারে:

public static IntStream intStream(byte[] array) {
    return IntStream.range(0, array.length).map(idx -> array[idx]);
}

সুতরাং আপনি আপনার প্রকল্পে এ জাতীয় স্থিতিশীল পদ্ধতি যুক্ত করতে পারেন এবং খুশি হতে পারেন।

byte[] অ্যারেতে স্ট্রিম সংগ্রহ করা আরও জটিল। স্ট্যান্ডার্ড জেডি কে ক্লাস ব্যবহার করা সহজ সমাধান হ'ল ByteArrayOutputStream :

public static byte[] toByteArray(IntStream stream) {
    return stream.collect(ByteArrayOutputStream::new, (baos, i) -> baos.write((byte) i),
            (baos1, baos2) -> baos1.write(baos2.toByteArray(), 0, baos2.size()))
            .toByteArray();
}

তবে এটি সিঙ্ক্রোনাইজেশনের কারণে অপ্রয়োজনীয় ওভারহেড রয়েছে। এছাড়াও বরাদ্দ এবং অনুলিপি হ্রাস করার জন্য পরিচিত দৈর্ঘ্যের স্ট্রিমগুলি বিশেষভাবে প্রক্রিয়া করা ভাল হবে। তবুও এখন আপনি byte[] অ্যারেগুলির জন্য স্ট্রিম এপিআই ব্যবহার করতে পারেন:

public static byte[] addStream(byte[] arr, byte addend) {
    return toByteArray(intStream(arr).map(b -> b+addend));
}

আমার StreamEx লাইব্রেরির এই দুটি ক্রিয়াকলাপই IntStreamEx ক্লাসে রয়েছে যা স্ট্যান্ডার্ড IntStream বাড়িয়ে IntStream তাই আপনি এটি ব্যবহার করতে পারেন:

public static byte[] addStreamEx(byte[] arr, byte addend) {
    return IntStreamEx.of(arr).map(b -> b+addend).toByteArray();
}

অভ্যন্তরীণভাবে toByteArray() পদ্ধতিতে সহজ আকার পরিবর্তনযোগ্য বাইট বাফার ব্যবহার করা হয় এবং যখন স্ট্রিমটি toByteArray() হয় এবং লক্ষ্য আকারটি আগাম পরিচিত হয় তখন toByteArray() বিশেষভাবে পরিচালনা করে।





boxing