স্কালায় Optional এবং Either দুটি গুরুত্বপূর্ণ ডেটা টাইপ যা ফাংশনাল প্রোগ্রামিংয়ের ধারণা অনুসরণ করে এবং ত্রুটি বা অবস্থা পরিচালনার জন্য ব্যবহৃত হয়। এগুলি সাধারণত ফাংশনাল প্রোগ্রামিং এ অপারেশনাল ফলাফল বা ত্রুটি হ্যান্ডলিং করার জন্য ব্যবহৃত হয়।
১. স্কালা Optional (Option)
Option হল একটি জেনেরিক টাইপ যা দুটি অবস্থা ধারণ করতে পারে:
Some(value): মান (value) ধারণ করে।None: কোনো মান নেই।
এটি সেই ক্ষেত্রে ব্যবহৃত হয় যেখানে কোনো মান পাওয়া যাবে কিনা তা অজানা থাকে। Option আপনাকে নিশ্চিত করে যে কোনো নাল (null) ভ্যালু রিটার্ন করা হবে না, যা কোডে নাল পয়েন্টার এক্সসেপশন (NullPointerException) থেকে মুক্তি দেয়।
Option এর গঠন:
Option(value)Some(value) এবং None এর মধ্যে পার্থক্য:
Some(value): কোনো মান সফলভাবে পাওয়া গেছে।None: মান পাওয়া যায়নি বা কোনো মান নেই।
উদাহরণ: Option ব্যবহার
def findUserById(id: Int): Option[String] = {
if (id == 1) Some("Alice") else None
}
val user1 = findUserById(1) // Some("Alice")
val user2 = findUserById(2) // None
user1 match {
case Some(name) => println(s"User found: $name")
case None => println("User not found")
}
user2 match {
case Some(name) => println(s"User found: $name")
case None => println("User not found")
}এখানে:
findUserByIdফাংশনটিOption[String]রিটার্ন করে।- যদি
id == 1হয়, তাহলেSome("Alice")ফেরত দিবে। - অন্যথায়
Noneফেরত দিবে।
- যদি
matchস্টেটমেন্ট ব্যবহার করেOptionথেকে মান এক্সট্র্যাক্ট করা হয়েছে।
Option এর কিছু সাধারণ অপারেশন:
getOrElse: যদিSome(value)থাকে, তবে সেই মানটি ফেরত দেয়, অন্যথায় একটি ডিফল্ট মান প্রদান করে।map: যদিSome(value)থাকে, তবে সেই মানের উপর একটি ফাংশন প্রয়োগ করা হয়।flatMap: মেটা ফাংশন হিসেবে ব্যবহৃত, যেখানে একটিOptionরিটার্ন করতে পারে।
val maybeUser = Some("John")
val result = maybeUser.getOrElse("Unknown User")
println(result) // Output: John
val modifiedUser = maybeUser.map(user => user.toUpperCase)
println(modifiedUser) // Output: Some(JOHN)২. স্কালা Either
Either একটি জেনেরিক টাইপ যা দুটি অবস্থার মধ্যে একটি ধারণ করতে পারে:
Left(value): সাধারণত ত্রুটি বা ব্যতিক্রম (error) ধারণ করতে ব্যবহৃত হয়।Right(value): সাধারণত সফল ফলাফল (success) ধারণ করতে ব্যবহৃত হয়।
Either মূলত Option এর চেয়ে বেশি তথ্য ধারণ করতে সক্ষম, কারণ এটি দুটি আলাদা পরিস্থিতি (ত্রুটি এবং সফলতা) মোকাবেলা করতে পারে।
Either এর গঠন:
Either[LeftType, RightType]Left(value): ত্রুটি বা ব্যতিক্রমের তথ্য।Right(value): সফলতার তথ্য।
উদাহরণ: Either ব্যবহার
def divide(a: Int, b: Int): Either[String, Int] = {
if (b == 0) Left("Cannot divide by zero")
else Right(a / b)
}
val result1 = divide(10, 2) // Right(5)
val result2 = divide(10, 0) // Left("Cannot divide by zero")
result1 match {
case Right(value) => println(s"Success: $value")
case Left(error) => println(s"Error: $error")
}
result2 match {
case Right(value) => println(s"Success: $value")
case Left(error) => println(s"Error: $error")
}এখানে:
divideফাংশনটিEither[String, Int]রিটার্ন করে, যেখানে:Right(value): সফল ফলাফল, যেমন ১০/২ = ৫।Left(error): ত্রুটি, যেমন ১০/০ = "Cannot divide by zero"।
Either এর কিছু সাধারণ অপারেশন:
map:Rightএর উপরে ফাংশন প্রয়োগ করা।flatMap: আরোEitherরিটার্ন করার জন্য ফাংশন প্রয়োগ করা।fold:LeftএবংRightউভয়কেই একটি একক ফলাফলে রূপান্তর করা।
val rightResult = Right(5)
val newValue = rightResult.map(_ * 2)
println(newValue) // Output: Right(10)৩. Option এবং Either এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Option | Either |
|---|---|---|
| ব্যবহার | যখন কোনো মান থাকতে পারে অথবা না থাকতে পারে | যখন সফলতা বা ত্রুটির মধ্যে একটি নির্ধারণ করতে হয় |
| মানের ধরন | Some(value) বা None | Right(value) বা Left(value) |
| ত্রুটি হ্যান্ডলিং | শুধুমাত্র মানের উপস্থিতি বা অনুপস্থিতি | ত্রুটি এবং সফলতার মধ্যে পার্থক্য করা যায় |
| এটা কবে ব্যবহার করবেন? | মান হতে পারে, কিন্তু ব্যতিক্রম বা ত্রুটি নেই | যে কোনো সময় দুটি আলাদা অবস্থা হ্যান্ডল করতে |
সারাংশ
Option: স্কালায় একটি ইমিউটেবল ডাটা টাইপ যা একটি মান বা কোনো মান না থাকার ক্ষেত্রে ব্যবহৃত হয়। এটিSome(value)বাNoneএর মাধ্যমে মান ধারণ করে।Either: স্কালায় একটি জেনেরিক ডাটা টাইপ যা দুটি আলাদা অবস্থা ধারণ করতে পারে:Left(ত্রুটি বা ব্যতিক্রম) এবংRight(সফলতা)।
এগুলো সাধারণত ফাংশনাল প্রোগ্রামিংয়ের ধারণা অনুসরণ করে ব্যবহৃত হয় এবং আপনার কোডকে নিরাপদ এবং নির্ভরযোগ্য করতে সহায়তা করে।
Read more