আমরা সাধারণত যেখানে সংগ্রহগুলি ফিরিয়ে আনতাম সেখানে স্ট্রিমগুলি ফিরিয়ে দেওয়া কি বুদ্ধিমানের কাজ?


19

কোনও লিগ্যাসি কোডের সাথে আবদ্ধ নয় এমন আমার এপিআই বিকাশ করার সময়, আমি প্রায়শই নিজেকে ফলাফলগুলি সংগ্রহের মাধ্যমে খাঁটি স্ট্রিমের পাইপলাইন খালি স্ট্রিমস পাইপলাইন লেখার পদ্ধতি দেখতে পাই। এটার মত:

ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
    return myPrivateThingies.stream()
        .map(this::ownerOfThing)
        .map(Owner::socialStatus)
        .filter(SocialStatus::isHeAFineMatey)
        .collect(MyCustomCollectors.toImmutableSet());
}

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

Stream<T> deriveSomethingMeaningfulFromPrivateState() {
    return myPrivateThingies.stream()
        .map(this::ownerOfthing)
        .map(Owner::socialStatus)
        .filter(SocialStatus::isHeAFineMatey);
        // No collect
}

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

আমার প্রাক জাভা -8 স্ব সংগ্রহটি যেদিকেই ফিরিয়ে দেবে যেখানেই আমি যখন কোনও স্ট্রিম ফিরিয়ে দেওয়ার সিদ্ধান্ত নিয়ে নিই তবে কি খারাপ কিছু ঘটতে পারে ? বা সম্ভবত আমি এখানে একটি অ্যান্টিপ্যাটার্নের কিছু করছি যা প্রাইভেট স্টেট থেকে প্রাপ্ত?

উত্তর:


14

যদি myPrivateThingiesপরিবর্তনীয় হয় তবে আপনি নিজের ব্যক্তিগত অবস্থা এবং স্ট্রিম ফলাফলের মধ্যে একটি লুকানো নির্ভরতা তৈরি করেছেন। যদি ক্লায়েন্টের পক্ষে পরোক্ষভাবে myPrivateThingiesরাষ্ট্র পরিবর্তন করার কারণ হয়ে থাকে, তবে collectআপনি মূলত যেটি দিতে চান তার চেয়ে কল করলে তিনি আলাদা ফলাফল পেতে চলেছেন ।

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

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

অন্যদিকে কোনও স্রোত ফিরিয়ে দেওয়া ক্লায়েন্টকে ফলাফল নির্ধারণের জন্য কোন ডেটা কাঠামোটি ব্যবহার করতে চান তা চয়ন করার ক্ষমতা দেয়, আপনি তার জন্য একটি বেছে নেওয়ার বিপরীতে। এটি উভয় বিকল্প প্রস্তাব মূল্যবান হতে পারে।


4

সর্বাধিক গুরুত্বপূর্ণ বিষয়টি বিবেচনা করুন: Streamগুলি কেবল একবারে পুনরাবৃত্তি করা যেতে পারে, তবে আপনার a এর চেয়ে আরও নমনীয়তা রয়েছে Collection: ফলাফলগুলিতে অতিরিক্ত পুনরাবৃত্তি প্রক্রিয়াকরণ করতে আপনি আরও বেশি Streamবা এমনকি তৈরি করতে চালিয়ে যেতে পারেন Iterator

সুতরাং যদি আপনি নিশ্চিত না হন যে পদ্ধতিটির কলকারীরা ফলাফল একবারে এবং একবার ব্যবহার করতে যাচ্ছেন, তবে এটির চেয়ে ভাল Collection


আপনার নমুনা কোডটিতে একটি সুস্পষ্ট ত্রুটি রয়েছে: কেন SocialStatusকোনও ব্যক্তির ধারণা থাকতে পারে he?


3

আমার দৃষ্টিতে, না। স্ট্রিমগুলির সাথে আপনি যে জিনিসগুলি করতে পারেন তা হ'ল সংগ্রহে আপনি যে জিনিসগুলি করতে পারেন তার একটি কঠোর সুপারসেট এবং প্রায়শই এগুলিকে আরও দক্ষ করা যায় তাই অচেনা বাদে এগুলি ব্যবহার না করার কোনও কারণ নেই। "লাম্বদা এক্সপ্রেশনগুলি জাভা 8 এর প্রবেশদ্বার ড্রাগ, তবে স্ট্রিমগুলি আসল আসক্তি" " (ভেঙ্কট সুব্রামণিয়াম, জাভাতে কার্যকরী প্রোগ্রামিং )

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