স্ট্রিম বনাম ভিউ আইটেমেটর


136

স্টালা, ভিউ (সেকভিউ) এবং স্কেলে আইট্রেটারগুলির মধ্যে পার্থক্যগুলি কী? এটি আমার বোঝাপড়া:

  • তারা সব অলস তালিকা।
  • স্ট্রিম মানগুলিকে ক্যাশে করে।
  • Iteters শুধুমাত্র একবার ব্যবহার করা যাবে? আপনি শুরুতে ফিরে যেতে পারেন এবং আবার মানটি মূল্যায়ন করতে পারবেন না?
  • দেখার মানগুলি ক্যাশে করা হয়নি তবে আপনি সেগুলি বারবার মূল্যায়ন করতে পারেন?

সুতরাং আমি যদি গাদা স্থানটি সংরক্ষণ করতে চাই, তবে আমি কি পুনরাবৃত্তকারীগুলি ব্যবহার করতে পারি (যদি আমি আবার তালিকায় প্রবেশ করি না) বা দর্শনগুলি? ধন্যবাদ।


7
আমি এর আগেও উত্তর দিয়েছি, তবে কীভাবে তা খুঁজে পাব? দীর্ঘশ্বাস ফেলুন ...
ড্যানিয়েল সি সোব্রাল

উত্তর:


182

প্রথমত, তারা সবাই অ-কঠোর । এটির সাথে ফাংশন সম্পর্কিত একটি নির্দিষ্ট গাণিতিক অর্থ রয়েছে তবে মূলত এর অর্থ তারা আগাম পরিবর্তে অন ডিমান্ডে গণিত হয়।

Streamসত্যিই একটি অলস তালিকা। বস্তুত, Scala, একটি Streamএকটি হল Listযার tailএকটি হল lazy val। একবার গণনা করা হলে, একটি মান গণনা করে আবার ব্যবহার করা হয়। বা, যেমন আপনি বলেছেন, মানগুলি ক্যাশেড।

একটি Iteratorকেবল একবার ব্যবহার করা যেতে পারে কারণ এটি কোনও সংগ্রহে ট্র্যাভার্সাল পয়েন্টার , এবং নিজেই সংগ্রহ নয়। এটা কি Scala মধ্যে বিশেষ করে তোলে যে আপনি যেমন রূপান্তর আবেদন করতে পারেন হয় mapএবং filterএবং কেবল একটি নতুন পেতে Iteratorযা শুধুমাত্র এই রূপান্তরের প্রযোজ্য হবে যখন আপনি পরবর্তী উপাদান জন্য জিজ্ঞাসা করুন।

স্কেল পুনরায় সেট করা যেতে পারে যা পুনরাবৃত্তকারী প্রদান করত, তবে এটি সাধারণ পদ্ধতিতে সমর্থন করা খুব শক্ত এবং তারা সংস্করণ ২.৮.০ তৈরি করেনি।

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

উভয় Iteratorএবং মতামতের দুর্দান্ত স্মৃতি বৈশিষ্ট্য রয়েছে। Streamদুর্দান্ত, তবে, স্কালায়, এর মূল উপকারটি হ'ল অসীম অনুক্রমগুলি (বিশেষত ক্রমগুলি পুনরাবৃত্তভাবে সংজ্ঞায়িত) writing এক করতে সব পালন এড়ানোর Streamনিশ্চিত করুন যে আপনি তার একটি রেফারেন্স রাখি না করে যদিও, মেমরি, head(উদাহরণস্বরূপ, ব্যবহার করে defপরিবর্তে valসংজ্ঞায়িত করতে Stream)।

দর্শনগুলির দ্বারা প্রদত্ত জরিমানার কারণে, সাধারণত forceরূপান্তর প্রয়োগের পরে এটি হওয়া উচিত , বা যদি ভিউর মোট আকারের তুলনায় কেবলমাত্র কয়েকটি উপাদানই পাওয়া যায় বলে আশা করা হয় তবে এটিকে দৃশ্য হিসাবে রাখা উচিত।


10
Iteratorঅসীমদের অনুসন্ধানের জন্যও বেশ সহজ, এবং আমি সাধারণত যেখানে স্ট্রিমের চেয়ে তাদের পছন্দ করি। স্ট্রিমগুলির আসল উপকারটি হ'ল পূর্বে অ্যাক্সেস করা মানগুলি ক্যাশে করা হয়, যা ফিবোনাচি সিকোয়েন্সের মতো কিছু বাস্তবায়নের চেষ্টা করার সময় মারাত্মক वरदान - যা পূর্ববর্তী মানগুলির নিরিখে সংজ্ঞায়িত হয়।
কেভিন রাইট

5
ফিবোনাচি নিখুঁত উদাহরণের চেয়ে কম কারণ এটি কেবল সর্বশেষ 2 পূর্ববর্তী মানগুলির প্রয়োজন এবং পুরো স্ট্রিমটি রাখা একটি অপচয়। অ্যাকারম্যান ফাংশন সম্ভবত ক্যানোনিকাল উদাহরণ।
জর্জেন স্ট্রোবেল

4
@ জারজেনস্ট্রোবেল অ্যাকারম্যানের অসাধারণ পারফরম্যান্সের ফলস্বরূপ, যেহেতু স্ট্রিমগুলির সূচকযুক্ত অ্যাক্সেস ও (এন)। তবে আমি আর্ট ফাইবোনাকি সম্মত।
ড্যানিয়েল সি সোব্রাল

9
হ্যাঁ সঠিক. এটি কোনও ক্যাশিং পদ্ধতির জন্য স্ট্রিমকে একটি দুর্বল পছন্দ করে তোলে।
জর্জেন স্ট্রোবেল

7
এই উত্তরটি অত্যন্ত স্পষ্ট, এটি ডকুমেন্টেশনের অংশ হওয়া উচিত ... ওহ, আসলে এটি! ধন্যবাদ ড্যানিয়েল docs.scala-lang.org/tutorials/FAQ/stream-view-iterator.html
Svend
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.