স্কালাতে স্ট্রিমস হল একটি ডেটা স্ট্রাকচার যা একে একে, পর্যায়ক্রমে উপাদান সরবরাহ করে। স্ট্রিমগুলি একাধিক উপাদান ধারণ করতে সক্ষম, কিন্তু এগুলো পুরোপুরি লোড বা ইন মেমোরি থাকে না। এর পরিবর্তে, এটি "অপরিশোধিত" উপাদানগুলিকে প্রয়োজনে প্রক্রিয়া করে, অর্থাৎ যখনই একটি উপাদান প্রয়োজন হয়, তখনই তা তৈরি বা গণনা করা হয়।
এটি লেইজি ইভ্যালুয়েশন ধারণার সাথে সম্পর্কিত, যেখানে মূল্যায়ন বা গণনা কেবল তখনই ঘটে যখন তা প্রয়োজনীয় হয়। এটি কার্যকরীভাবে স্মৃতি এবং পারফরম্যান্সের ক্ষেত্রে একটি গুরুত্বপূর্ণ ধারণা।
১. স্ট্রিমস (Streams) এর ধারণা:
স্ট্রিম হল একটি সিকোয়েন্স বা ক্রম যা এমনভাবে গঠিত যে একে একে উপাদানগুলো উৎপন্ন করা হয় এবং একে একে এগুলোকে প্রক্রিয়া করা হয়। স্ট্রিমের উপাদানগুলি সাধারণত এক্সটেনশন বা লেইজি ইভ্যালুয়েশন এর মাধ্যমে পাওয়া যায়, অর্থাৎ স্ট্রিমের উপাদানগুলি তখনই তৈরি হয় যখন তাদের প্রয়োজন হয়।
স্ট্রিমের কিছু মৌলিক বৈশিষ্ট্য:
- ইমিউটেবল: স্ট্রিমের উপাদানগুলি পরিবর্তন করা যায় না। এটি এক ধরনের immutable ডেটা স্ট্রাকচার।
- লেইজি: স্ট্রিমের উপাদানগুলি তখনই গণনা বা তৈরি হয় যখন তা প্রয়োজনীয় হয়।
- কর্মক্ষমতা: স্ট্রিম গুলি সাধারণত বড় ডেটাসেট পরিচালনা করতে কার্যকরী, কারণ এগুলি প্রয়োজন অনুযায়ী উপাদান উৎপন্ন করে।
২. লেইজি ইভ্যালুয়েশন (Lazy Evaluation):
লেইজি ইভ্যালুয়েশন হল এমন একটি প্রক্রিয়া, যেখানে কেবল তখনই কোন কার্য সম্পাদিত হয় যখন তা কার্যকরভাবে প্রয়োজন হয়। অন্য কথায়, একটি স্ট্রিমে একাধিক অপারেশন প্রয়োগ করার সময়, এর উপাদানগুলির বাস্তবায়ন কেবল তখনই হয় যখন সেগুলোর কার্যকর ব্যবহার হয়।
এটি ডেটা প্রক্রিয়াকরণের দক্ষতা বৃদ্ধি করে এবং মেমোরি ব্যবহারের ক্ষেত্রে সুবিধা প্রদান করে।
লেইজি ইভ্যালুয়েশনের সুবিধা:
- পারফরম্যান্স: যদি স্ট্রিমে অনেক উপাদান থাকে, তবে সেগুলোর সবকিছুর জন্য গণনা না করে কেবলমাত্র প্রয়োজনীয় অংশই প্রক্রিয়া করা হয়।
- মেমোরি দক্ষতা: স্ট্রিমগুলি infinite (অসীম) হতে পারে, এবং Lazy Evaluation এর মাধ্যমে আমরা মেমোরি ব্যবহার করে শুধু প্রয়োজনীয় উপাদানগুলিই গণনা করি, পুরো স্ট্রিমকে একসাথে মেমোরিতে লোড না করে।
- জটিল প্রক্রিয়াগুলির সহজ সমাধান: স্ট্রিমের মাধ্যমে জটিল এবং ভারী ডেটা প্রক্রিয়াকরণ সহজতর হয়, কারণ একে একে উপাদান প্রক্রিয়া করা হয়।
৩. স্ট্রিম এর অপারেশন:
স্ট্রিমে কিছু সাধারণ অপারেশন রয়েছে যেগুলি লেইজি ইভ্যালুয়েশন ব্যবহার করে কাজ করে:
- map: একটি ফাংশন প্রয়োগ করে স্ট্রিমের প্রতিটি উপাদান পরিবর্তন করা।
- filter: শর্তের মাধ্যমে স্ট্রিমের উপাদান ফিল্টার করা।
- flatMap: একটি স্ট্রিম থেকে অন্য স্ট্রিম তৈরি করা।
- reduce: স্ট্রিমের উপাদানগুলোকে একটি একক মানে রিডিউস করা।
- collect: স্ট্রিমের উপাদানগুলোকে একটি সংগ্রহে (যেমন লিস্ট) পরিণত করা।
উদাহরণ ১: স্ট্রিমের সাথে map এবং filter ব্যবহার
val numbers = Stream(1, 2, 3, 4, 5, 6)
val evenNumbers = numbers.filter(x => x % 2 == 0).map(x => x * 2)
println(evenNumbers.take(3).toList) // Output: List(4, 8, 12)এখানে, প্রথমে filter ফাংশনটি স্ট্রিমের মধ্যে থেকে ইভেন সংখ্যাগুলি ফিল্টার করেছে এবং তারপর map ফাংশনটি প্রতিটি ইভেন সংখ্যার দ্বিগুণ করেছে। take(3) ব্যবহার করে প্রথম তিনটি উপাদান প্রিন্ট করা হয়েছে।
৪. লেইজি স্ট্রিমের সাথে অ্যালগরিদমের উন্নতি:
লেইজি ইভ্যালুয়েশন দিয়ে অসীম স্ট্রিম তৈরি করা সম্ভব। অর্থাৎ, আপনি অনন্ত সংখ্যার একটি স্ট্রিম তৈরি করতে পারেন যা কেবল তখনই উপাদান উৎপন্ন করবে যখন তা প্রয়োজন হবে।
উদাহরণ ২: অসীম স্ট্রিমের সাথে কাজ
val naturalNumbers = Stream.from(1) // 1, 2, 3, 4, 5, 6, ...
val firstTen = naturalNumbers.take(10).toList // প্রথম ১০টি সংখ্যার একটি লিস্ট তৈরি
println(firstTen) // Output: List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)এখানে, Stream.from(1) দিয়ে একটি অসীম স্ট্রিম তৈরি করা হয়েছে যা 1, 2, 3, ... ক্রমে চলতে থাকে। তবে take(10) এর মাধ্যমে শুধুমাত্র প্রথম ১০টি উপাদান নেয়া হয়েছে, এবং এটি কেবল তখনই গণনা করা হয়েছে যখন এটি প্রয়োজন হয়েছিল।
৫. স্ট্রিম এর ব্যবহার এবং প্রয়োগ:
স্ট্রিম ব্যবহার করে আপনি অনেক বড় ডেটাসেট নিয়ে কাজ করতে পারেন, যেখানে সাধারণভাবে লিস্ট বা অন্যান্য ডেটা স্ট্রাকচারে পুরো ডেটাসেট মেমোরিতে রাখা সম্ভব নয়।
উদাহরণ ৩: স্ট্রিমের মধ্যে বড় ডেটাসেট প্রক্রিয়া
val bigDataStream = Stream.continually(scala.util.Random.nextInt(100)) // অসীম র্যান্ডম সংখ্যা
val result = bigDataStream.filter(x => x > 50).take(5).toList // ৫০ এর বেশি ৫টি সংখ্যা নেওয়া হচ্ছে
println(result)এখানে, স্ট্রিমে অসীম র্যান্ডম সংখ্যা তৈরি হচ্ছে এবং filter অপারেশন দিয়ে ৫০ এর বেশি সংখ্যাগুলি ফিল্টার করা হচ্ছে। এরপর take(5) এর মাধ্যমে প্রথম ৫টি ফলাফল সংগ্রহ করা হচ্ছে।
সারাংশ:
স্ট্রিমস হল একটি কার্যকরী ডেটা স্ট্রাকচার যা লেইজি ইভ্যালুয়েশন ব্যবহার করে উপাদান একে একে তৈরি এবং প্রক্রিয়া করে। স্ট্রিমগুলি খুব বড় বা অসীম ডেটাসেটগুলির জন্য খুবই উপকারী, কারণ এগুলি মেমোরি এবং পারফরম্যান্সের ক্ষেত্রে দক্ষতা প্রদান করে। লেইজি ইভ্যালুয়েশন স্ট্রিমের মাধ্যমে শুধুমাত্র প্রয়োজনীয় উপাদানই প্রক্রিয়া হয়, যা সম্পদ ব্যবহারে সাহায্য করে।
Read more