জাভাতে, লুপগুলি ধরে স্ট্রিমগুলির সুবিধা কী কী? [বন্ধ]


133

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


এটি কতটা সংক্ষিপ্তভাবে উত্তর দেওয়া হয়েছিল তা বিবেচনা করে দেখে মনে হচ্ছে এটি সর্বোপরি কোনও প্রশ্ন খুব একটা বড় ছিল না।


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

... বা এটিকে খুব বিস্তৃত হিসাবে বিবেচনা করা হচ্ছে কারণ কেউ সত্যই দীর্ঘ দীর্ঘ মাল্টি-পয়েন্ট উত্তর দিয়েছেন? সত্যিকার অর্থে যে কেউ জানেন যে কার্যত কোনও প্রশ্ন দিয়ে তা করতে পারে। আপনি যদি জেভিএম-র অন্যতম লেখক হয়ে থাকেন, উদাহরণস্বরূপ, আপনি সম্ভবত সারা দিন লুপগুলি নিয়ে কথা বলতে পারেন যখন আমাদের বেশিরভাগই পারত না।

"পর্যাপ্ত উত্তর সনাক্ত করতে পর্যাপ্ত বিশদ সহ একটি নির্দিষ্ট সমস্যায় সীমাবদ্ধ রাখতে দয়া করে প্রশ্নটি সম্পাদনা করুন once একবারে একাধিক স্বতন্ত্র প্রশ্ন জিজ্ঞাসা করবেন না this এই প্রশ্নটি পরিষ্কার করার জন্য সহায়তার জন্য কীভাবে জিজ্ঞাসা করুন পৃষ্ঠাটি দেখুন" "

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


7
এটি ইমো মতামত-ভিত্তিক। ব্যক্তিগতভাবে, আমি স্ট্রীমগুলিকে পছন্দ করি কারণ এটি কোডটি আরও পঠনযোগ্য করে তোলে। এটি কীভাবে পরিবর্তে আপনি যা চান তা লিখতে দেয় । তদুপরি, ওয়ান-লাইনারগুলির সাথে আশ্চর্যজনক কাজ করা সম্পূর্ণ খারাপ is
আর্নৌদ ডনোইলে

19
এটি যদি 30 লাইন, একটি লাইনার হয়? আমি দীর্ঘ শৃঙ্খলার পছন্দ না।
ব্যবহারকারী 447607

1
এছাড়াও, আমি এখানে যা খুঁজছি তা হ'ল একটি সাক্ষাত্কারের জন্য উপযুক্ত প্রতিক্রিয়া। এটি একমাত্র "মতামত" যা গুরুত্বপূর্ণ।
ব্যবহারকারী 447607

1
শিক্ষাগতভাবে বলতে গেলে, এই প্রশ্নটি ভবিষ্যতের একটি সাক্ষাত্কারে আমারও কিছুটা অবক্ষয়কে বাঁচিয়েছিল, @ স্লিম সত্যিই এটি পেরেক দিয়েছিল, তবে শিল্পগতভাবে বলতে গেলে, এটি মাইক্রোসফ্ট প্রোগ্রামিং ভাষাগুলি কীভাবে জাভা ভাষার ছিঁড়ে ফেলার ক্ষেত্রে তাদের ক্যারিয়ার তৈরি করেছিল, এবং অবশেষে জাভা ফাটিয়ে দেওয়ার দ্বারা প্রতিশোধ নিয়েছিল তাও বলেছে লাম্বডা এক্সপ্রেশন বন্ধ করে এবং বিরোধীদের কাছ থেকে প্রবাহিত হয়, আসুন দেখি যে জাভা ভবিষ্যতে
স্ট্রাক্টস

5
নোট করুন যে স্ট্রিমগুলি কেবল কার্যকরী প্রোগ্রামিংয়ে পাওয়ারের একটি ভগ্নাংশটি ট্যাপ করে: - /
থরবজর্ন রাভন অ্যান্ডারসেন

উত্তর:


251

ইন্টারভিউয়ের প্রশ্নটি অসুবিধাগুলি সম্পর্কে জিজ্ঞাসা না করে সুবিধাগুলির বিষয়ে জিজ্ঞাসা করে আকর্ষণীয়, কারণ উভয়ই রয়েছে।

স্ট্রিমগুলি আরও ঘোষিত স্টাইল । বা আরও উদ্বেগজনক স্টাইল। কোডটি কীভাবে করা হয়েছে তা বর্ণনা করার চেয়ে কোডটিতে আপনার অভিপ্রায়টি ঘোষণা করা ভাল বলে বিবেচিত হতে পারে :

 return people
     .filter( p -> p.age() < 19)
     .collect(toList());

... পুরোপুরি স্পষ্ট করে বলেছে যে আপনি একটি তালিকা থেকে ম্যাচের উপাদানগুলি ফিল্টার করছেন, যেখানে:

 List<Person> filtered = new ArrayList<>();
 for(Person p : people) {
     if(p.age() < 19) {
         filtered.add(p);
     }
 }
 return filtered;

বলে "আমি একটি লুপ করছি"। লুপটির উদ্দেশ্যটি যুক্তির আরও গভীরভাবে সমাহিত করা হয়।

স্ট্রিমগুলি প্রায়শই টর্সার হয় । একই উদাহরণ এটি দেখায়। পরিশ্রম সর্বদা ভাল হয় না, তবে আপনি যদি একই সময়ে সংশ্লেষ এবং ভাব প্রকাশ করতে পারেন তবে আরও ভাল।

স্ট্রিমগুলির ক্রিয়াকলাপগুলির সাথে একটি দৃ aff় সম্পর্ক রয়েছে । জাভা 8 ল্যাম্বডাস এবং ফাংশনাল ইন্টারফেসগুলি উপস্থাপন করে যা শক্তিশালী কৌশলগুলির পুরো খেলনাবাক্সটি খোলে। স্ট্রিমগুলি অবজেক্টের সিকোয়েন্সগুলিতে ফাংশন প্রয়োগ করার সবচেয়ে সুবিধাজনক এবং প্রাকৃতিক উপায় সরবরাহ করে provide

স্ট্রিমগুলি কম পরিবর্তনকে উত্সাহ দেয় । এটি ক্রিয়াকলাপের প্রোগ্রামিংয়ের দিকের সাথে সম্পর্কিত - আপনি স্ট্রিম ব্যবহার করে যে ধরণের প্রোগ্রাম লেখেন সে ধরণের প্রোগ্রামগুলির প্রবণতা রয়েছে যেখানে আপনি বস্তুগুলিকে সংশোধন করেন না।

স্ট্রিমগুলি আলগা দম্পতিকে উত্সাহ দেয় । আপনার স্ট্রিম-হ্যান্ডলিং কোডটির স্ট্রিমের উত্স বা এর পরিণামের সমাপ্তির পদ্ধতিটি জানা দরকার।

স্ট্রিমগুলি সংক্ষিপ্তভাবে বেশ পরিশীলিত আচরণ প্রকাশ করতে পারে । উদাহরণ স্বরূপ:

 stream.filter(myfilter).findFirst();

প্রথম নজরে তাকান যেমন এটি পুরো স্ট্রিমটি ফিল্টার করে, তবে প্রথম উপাদানটি ফেরত দেয়। তবে বাস্তবে findFirst()পুরো অপারেশনটি চালিত করে, তাই এটি কোনও আইটেম সন্ধানের পরে দক্ষতার সাথে থামে।

স্ট্রিমগুলি ভবিষ্যতের দক্ষতা অর্জনের সুযোগ দেয় । কিছু লোক বেঞ্চমার্ক করেছেন এবং দেখেছেন যে ইন-মেমরি Listএস বা অ্যারে থেকে একক থ্রেডযুক্ত স্ট্রিমগুলি সমতুল্য লুপের চেয়ে ধীর হতে পারে। এটি প্রশ্রয়যোগ্য কারণ খেলায় বেশি অবজেক্ট এবং ওভারহেড রয়েছে।

তবে স্ট্রিম স্কেল। সমান্তরাল স্ট্রিম ক্রিয়াকলাপের জন্য জাভার অন্তর্নির্মিত সমর্থন হিসাবে, API হিসাবে স্ট্রিমগুলি ব্যবহার করে বিতরণ করা মানচিত্র-হ্রাসের জন্য কয়েকটি গ্রন্থাগার রয়েছে কারণ মডেলটি ফিট করে।

অসুবিধেও?

পারফরম্যান্স : forএকটি অ্যারের মাধ্যমে লুপটি হ্যাপ এবং সিপিইউ ব্যবহারের ক্ষেত্রে উভয়ই অত্যন্ত হালকা। যদি কাঁচা গতি এবং মেমরির সাফল্য অগ্রাধিকার হয় তবে একটি স্ট্রিম ব্যবহার করা আরও খারাপ।

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

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

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


4
আমি মনে করি যে ঝরঝরে পরিষ্কার হবে যে স্ট্রিমের মতো জিনিসগুলি আরও সাধারণ হয়ে উঠছে এবং এখন প্রচলিত ব্যবহৃত ভাষাগুলিতে প্রদর্শিত হবে যা বিশেষত এফপি-ভিত্তিক নয়।
কেসি

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

1
@ হেনরিক কেজুস অ্যালাস্টাড এটি যোগাযোগ করার ইচ্ছা করে নি এমন একদমই নয়। স্ট্রিমগুলি পরিপক্ক, শক্তিশালী, অভিব্যক্তিপূর্ণ এবং উত্পাদন-গ্রেড কোডের জন্য সম্পূর্ণ উপযুক্ত।
পাতলা

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

1
@ লিজেপদম - তবে আপনার কাছে এখনও কোড রয়েছে যা বলছে যে "আমি এই তালিকার উপরে পুনরাবৃত্তি করছি (কেন এটির জন্য লুপটির ভিতরে দেখুন)", যখন "তালিকার উপরে পুনরাবৃত্তি" কোডটির মূল উদ্দেশ্য নয়।
পাতলা

16

সিন্ট্যাকটিক মজা একদিকে রেখে, স্ট্রিমগুলি সম্ভাব্য সীমাহীন বড় ডেটা সেটগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়েছে, যেখানে অ্যারে, সংগ্রহগুলি এবং প্রায় প্রতিটি জাভা এসই ক্লাস যা আইটেবল প্রয়োগ করে তা সম্পূর্ণ স্মৃতিতে থাকে।

স্ট্রিমের একটি অসুবিধা হ'ল ফিল্টার, ম্যাপিংস ইত্যাদি চেক করা ব্যতিক্রম ছুঁড়ে ফেলতে পারে না। এটি মধ্যবর্তী আই / ও অপারেশনগুলির জন্য স্ট্রিমকে একটি দুর্বল পছন্দ করে তোলে।


7
অবশ্যই, আপনি অসীম উত্সগুলিও লুপ করতে পারেন।
পাতলা

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

2
@ ল্যুইসমার্টিনেজ একটি ভাল ডিবি ক্লায়েন্ট লাইব্রেরি এর মতো কিছু ফিরিয়ে দেবে Stream<Row>- অথবা Streamডিবি রেজাল্ট কার্সার ক্রিয়াকলাপ মোড়ানো নিজের প্রয়োগ বাস্তবায়ন লিখতে সম্ভব হবে ।
পাতলা

যে স্ট্রিমগুলি নিঃশব্দে ব্যতিক্রমগুলি উপেক্ষা করে তা হ'ল একটি বাগ আমাকে সম্প্রতি কাটা হয়েছিল। Unintuitive।
xxfelixxx 0

@xxfelixxx স্ট্রিম চুপচাপ ব্যতিক্রম উপেক্ষা করে না। এটি চালানোর চেষ্টা করুন:Arrays.asList("test", null).stream().forEach(s -> System.out.println(s.length()));
ভিজিআর

8
  1. আপনি ভুলভাবে অনুধাবন করেছেন: সমান্তরাল ক্রিয়াকলাপগুলি Streamএস ব্যবহার করে না Optional

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

    myMethod2(myMethod(stream.transform(...)).filter(...))

    অন্যান্য অনেকগুলি ভাষা (সি #, কোটলিন, স্কালা ইত্যাদি) কিছু প্রকারের "এক্সটেনশন পদ্ধতিগুলি" মঞ্জুরি দেয়।

  3. এমনকি যখন আপনার কেবল ক্রমিক ক্রিয়াকলাপ প্রয়োজন এবং সেগুলি পুনরায় ব্যবহার করতে চান না, যাতে আপনি উভয় প্রবাহ বা লুপ ব্যবহার করতে পারেন, স্রোতে সাধারণ ক্রিয়াকলাপগুলি লুপগুলিতে বেশ জটিল পরিবর্তনের সাথে সামঞ্জস্য হতে পারে।


ব্যাখ্যা ১. theচ্ছিক ইন্টারফেসটি কি সেই উপায় নয় যার মাধ্যমে শৃঙ্খলে নালগুলি পরিচালনা করা হয়? 3 সম্পর্কিত, এটি বোধগম্য কারণ সংক্ষিপ্ত প্রচারিত ফিল্টারগুলির সাথে, পদ্ধতিটি কেবলমাত্র নির্দিষ্ট ঘটনার জন্যই অনুরোধ করা হবে। দক্ষ. এটি বুঝে যায় যে আমি উল্লেখ করতে পারি যে এগুলি ব্যবহার করে অতিরিক্ত কোড লেখার প্রয়োজনীয়তা হ্রাস করা হবে যা পরীক্ষা করা দরকার ইত্যাদি। পর্যালোচনা করার পরে, আমি নিশ্চিত নই যে আপনি ২.
ইউজার 447607

1. এর Optionalবিকল্প null, তবে সমান্তরাল ক্রিয়াকলাপগুলির সাথে এটির কোনও সম্পর্ক নেই। আপনার প্রশ্নে "এখন আমি বুঝতে পারি যে আমি বিকল্পগুলির কথা ভাবছিলাম" যদি না কেবল nullহ্যান্ডলিংয়ের কথা বলা হয় ?
আলেক্সি রোমানভ

আমি 2 এবং 3 এর ক্রম পরিবর্তন করেছি এবং উভয়কে কিছুটা প্রসারিত করেছি।
আলেক্সি রোমানভ

6

আপনি একটি সিকোয়েন্স (অ্যারে, সংগ্রহ, ইনপুট, ...) লুপ করবেন কারণ আপনি ক্রমের উপাদানগুলিতে কিছু ফাংশন প্রয়োগ করতে চান।

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

সুতরাং বেশিরভাগ ক্ষেত্রে কিছু লুপিংয়ের কাজ দেওয়া আপনি স্ট্রিম ব্যবহার করে কম কোড দিয়ে প্রকাশ করতে পারবেন, অর্থাত আপনি পঠনযোগ্যতা অর্জন করুন ।


4
ঠিক আছে, যদিও এটি কেবল পঠনযোগ্যতা নয়। আপনাকে যে কোডটি লিখতে হবে না তা হ'ল কোড আপনাকে পরীক্ষা করতে হবে না।
ব্যবহারকারী 447607

3
আপনিও আপনার ইন্টারভিউ জন্য ভাল উত্তরের সঙ্গে দেখানো হচ্ছে বলে মনে হয়
wero

6

আমি এর সমান্তরালতাটি বলব যা ব্যবহার করা এত সহজ। লুপের জন্য সমান্তরালভাবে কয়েক মিলিয়ন এন্ট্রিগুলিকে পুনরাবৃত্তি করার চেষ্টা করুন। আমরা অনেক সিপাসে যাই, দ্রুত নয়; সুতরাং সমান্তরালভাবে চালানো আরও ভালতরতর, এবং এর সাথে Streamএটি একটি বাতাস।

আমি যা পছন্দ করি তা হ'ল তারা প্রস্তাবিত ভার্বোসিটি । তারা আসলে কী তা বোঝে এবং তারা কীভাবে এটি করে তার বিপরীতে উত্পাদন করতে খুব কম সময় লাগে takes

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