স্কালাতে কাস্টম ইটারেটরস (Custom Iterators) এবং কাস্টম অপারেশনস (Custom Operations) তৈরি করা খুবই সহজ, কারণ স্কালা একটি শক্তিশালী ফাংশনাল প্রোগ্রামিং ভাষা এবং এটি ইটারেটর এবং কালেকশনস ম্যানিপুলেট করার জন্য অনেক উপকরণ সরবরাহ করে। আপনি নিজের কাস্টম ইটারেটর তৈরি করতে পারেন যা আপনার প্রয়োজন অনুযায়ী বিভিন্ন কালেকশনে পরিভ্রমণ (traverse) করবে এবং কাস্টম অপারেশনস যোগ করতে পারেন যেগুলি কালেকশনের উপাদানগুলোর উপর কার্যকরী হবে।
কাস্টম ইটারেটর (Custom Iterators)
স্কালাতে, ইটারেটর এমন একটি অবজেক্ট যা কালেকশনের উপাদানগুলোকে একে একে অ্যাক্সেস করতে সক্ষম। ইটারেটর তৈরি করার জন্য, আপনাকে সাধারণত Iterator ট্রেইট (trait) ব্যবহার করতে হবে।
কাস্টম ইটারেটর তৈরি করার উদাহরণ:
ধরা যাক, আপনি একটি কালেকশন তৈরি করতে চান যা এমন একটি সংখ্যার সিরিজ তৈরি করবে, যেখানে প্রতি সংখ্যার মধ্যে একটি নির্দিষ্ট ইন্টারভাল থাকবে (যেমন ১ থেকে ১০ পর্যন্ত, যেখানে প্রতিটি সংখ্যার মধ্যে ৩ এর যোগফল থাকবে)।
class CustomIterator(start: Int, end: Int, step: Int) extends Iterator[Int] {
private var current = start
// hasNext চেক করে যে পরবর্তী উপাদান আছে কি না
override def hasNext: Boolean = current <= end
// next পরবর্তী উপাদান প্রদান করে এবং current আপডেট করে
override def next(): Int = {
if (!hasNext) throw new NoSuchElementException
val result = current
current += step
result
}
}
// কাস্টম ইটারেটর ব্যবহার করা
val customIterator = new CustomIterator(1, 10, 3)
while (customIterator.hasNext) {
println(customIterator.next())
}এখানে, CustomIterator ক্লাসটি একটি কাস্টম ইটারেটর তৈরি করেছে যা ১ থেকে ১০ পর্যন্ত ৩ এর স্টেপে সংখ্যা প্রদান করবে। এর আউটপুট হবে:
1
4
7
10কাস্টম ইটারেটর তৈরি করার সময় মনে রাখার বিষয়গুলি:
hasNextমেথড: ইটারেটরটি যখন আর কোনো উপাদান প্রদান করতে না পারে, তখন এটিfalseরিটার্ন করবে।nextমেথড: এটি পরবর্তী উপাদান প্রদান করে এবং ইটারেটরটির স্টেট আপডেট করে।
কাস্টম অপারেশনস (Custom Operations)
কাস্টম অপারেশনস তৈরি করতে, আপনি একটি Iterator বা একটি কালেকশনের উপর যে কোনো ফাংশন প্রয়োগ করতে পারেন। স্কালাতে, কালেকশনস উপর যেকোনো অপারেশন যেমন map, filter, fold, reduce ইত্যাদি করা যায়, এবং আপনি চাইলে নতুন কাস্টম অপারেশনও তৈরি করতে পারেন।
কাস্টম অপারেশন তৈরি করার উদাহরণ:
ধরা যাক, আমরা একটি কাস্টম map অপারেশন তৈরি করতে চাই যা প্রতি উপাদানকে কেবলমাত্র দ্বিগুণ না করে, বরং ৩ গুণ বাড়াবে।
class CustomCollection[A](val elements: List[A]) {
// কাস্টম map অপারেশন
def customMap[B](f: A => B): List[B] = {
var result = List[B]()
for (elem <- elements) {
result = result :+ f(elem)
}
result
}
}
// কাস্টম অপারেশন ব্যবহার করা
val numbers = new CustomCollection(List(1, 2, 3, 4, 5))
val tripled = numbers.customMap(x => x * 3)
println(tripled) // List(3, 6, 9, 12, 15)এখানে, customMap ফাংশনটি একটি কাস্টম map অপারেশন তৈরি করেছে যা প্রতিটি উপাদানকে ৩ গুণ বাড়িয়ে নতুন একটি লিস্ট তৈরি করে।
কাস্টম filter অপারেশন উদাহরণ:
class CustomCollection[A](val elements: List[A]) {
// কাস্টম filter অপারেশন
def customFilter(p: A => Boolean): List[A] = {
var result = List[A]()
for (elem <- elements) {
if (p(elem)) result = result :+ elem
}
result
}
}
val numbers = new CustomCollection(List(1, 2, 3, 4, 5))
val evenNumbers = numbers.customFilter(x => x % 2 == 0)
println(evenNumbers) // List(2, 4)এখানে, customFilter ফাংশনটি একটি কাস্টম filter অপারেশন তৈরি করেছে যা শর্ত অনুযায়ী উপাদানগুলো ফিল্টার করে একটি নতুন লিস্ট প্রদান করে।
fold এবং reduce এর সাথে কাস্টম অপারেশনস
যদি আপনি একটি কালেকশনের উপাদানগুলোর উপর অ্যাগ্রিগেশন করতে চান, তবে আপনি fold বা reduce অপারেশন তৈরি করতে পারেন।
কাস্টম fold অপারেশন উদাহরণ:
class CustomCollection[A](val elements: List[A]) {
// কাস্টম fold অপারেশন
def customFold[B](initial: B)(f: (B, A) => B): B = {
var result = initial
for (elem <- elements) {
result = f(result, elem)
}
result
}
}
val numbers = new CustomCollection(List(1, 2, 3, 4, 5))
val sum = numbers.customFold(0)((acc, x) => acc + x)
println(sum) // 15এখানে, customFold অপারেশনটি একটি সাধারণ fold অপারেশন তৈরি করেছে যা একটি ইনিশিয়াল মান নিয়ে সমস্ত উপাদান যোগ করতে ব্যবহার করা হচ্ছে।
সারাংশ
কাস্টম ইটারেটরস এবং কাস্টম অপারেশনস তৈরি করার মাধ্যমে আপনি আপনার প্রয়োজন অনুযায়ী ডেটা কালেকশন এবং প্রসেসিংকে পুরোপুরি কাস্টমাইজ করতে পারেন। স্কালাতে ইটারেটর এবং কালেকশনস এর অপারেশনগুলি ফাংশনাল প্রোগ্রামিং কৌশল সমর্থন করে, যার মাধ্যমে আপনি শক্তিশালী এবং নমনীয় ডেটা স্ট্রাকচার তৈরি করতে পারেন। কাস্টম ইটারেটরগুলি আপনাকে আপনার নিজের ডেটা প্রবাহ এবং পরিভ্রমণের কৌশল তৈরির সুযোগ দেয়, আর কাস্টম অপারেশনস ডেটার উপর নির্দিষ্ট কার্যকলাপ প্রয়োগ করতে সাহায্য করে।
Read more