Kotlin Extensions এবং Standard Library
কটলিনের Extensions এবং Standard Library হলো প্রোগ্রামিং ভাষার শক্তিশালী ফিচার, যা কোডের কার্যকারিতা এবং রিডেবিলিটি বাড়াতে সাহায্য করে। Extensions ব্যবহার করে আপনি বিদ্যমান ক্লাসগুলিতে নতুন ফাংশন যোগ করতে পারেন, এবং Standard Library বিভিন্ন বিল্ট-ইন ফাংশন ও ক্লাস সরবরাহ করে যা দৈনন্দিন প্রোগ্রামিং কাজ সহজ করে তোলে।
১. Kotlin Extensions
Extensions আপনাকে বিদ্যমান ক্লাসে নতুন ফাংশন যোগ করার সুযোগ দেয়, যা কেবলমাত্র সেই ক্লাসের ইনস্ট্যান্সের উপর কাজ করে। এটি কোনও ক্লাসের বেস ক্লাস পরিবর্তন না করেই কার্যকরভাবে কাজ করে।
i) Extension Function
Extension Function তৈরি করতে, আপনাকে fun কিওয়ার্ডের আগে ক্লাসের নাম দিতে হবে।
উদাহরণ:
fun String.isEmailValid(): Boolean {
return this.contains("@") && this.contains(".")
}
fun main() {
val email = "example@gmail.com"
println("Is email valid? ${email.isEmailValid()}") // আউটপুট: Is email valid? true
}
ব্যাখ্যা:
- এখানে
Stringক্লাসেisEmailValidনামে একটি extension function যোগ করা হয়েছে যা ইমেইল ভ্যালিডেশন করে।
ii) Extension Properties
Extension Properties তৈরি করতে আপনি কেবল একটি get() ফাংশন ব্যবহার করতে পারেন।
উদাহরণ:
val String.firstChar: Char
get() = this[0]
fun main() {
val text = "Kotlin"
println("First character: ${text.firstChar}") // আউটপুট: First character: K
}
ব্যাখ্যা:
- এখানে
Stringক্লাসের জন্যfirstCharনামে একটি extension property তৈরি করা হয়েছে, যা স্ট্রিংয়ের প্রথম ক্যারেক্টার রিটার্ন করে।
২. Standard Library
Kotlin Standard Library একটি সমৃদ্ধ লাইব্রেরি যা বিভিন্ন বিল্ট-ইন ফাংশন এবং ক্লাস সরবরাহ করে। এটি ব্যবহারকারীদের সাধারণ কাজগুলো সহজে সম্পন্ন করতে সাহায্য করে।
i) Collections
Standard Library বিভিন্ন ধরনের Collections সরবরাহ করে, যেমন: List, Set, Map।
উদাহরণ:
val numbers = listOf(1, 2, 3, 4)
val doubledNumbers = numbers.map { it * 2 }
println(doubledNumbers) // আউটপুট: [2, 4, 6, 8]
ব্যাখ্যা:
- এখানে
mapফাংশন ব্যবহার করে একটি List এর প্রতিটি আইটেমের উপর কাজ করা হয়েছে।
ii) String Functions
Standard Library এ অনেক বিল্ট-ইন String ফাংশন রয়েছে।
উদাহরণ:
val text = "Kotlin Programming"
println(text.toUpperCase()) // আউটপুট: KOTLIN PROGRAMMING
println(text.substring(0, 6)) // আউটপুট: Kotlin
ব্যাখ্যা:
- এখানে
toUpperCaseএবংsubstringফাংশন ব্যবহার করা হয়েছে।
iii) Functional Programming Support
কটলিন Standard Library Functional Programming কে সমর্থন করে, যেমন: filter, map, reduce ইত্যাদি।
উদাহরণ:
val numbers = listOf(1, 2, 3, 4, 5)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // আউটপুট: [2, 4]
ব্যাখ্যা:
- এখানে
filterফাংশন ব্যবহার করে একটি List থেকে জোড় সংখ্যা বের করা হয়েছে।
৩. Advantages of Extensions and Standard Library
- Code Reusability: Extensions দ্বারা আপনি বিদ্যমান ক্লাসে নতুন ফাংশন যোগ করতে পারেন, যা কোড পুনঃব্যবহারযোগ্য করে তোলে।
- Improved Readability: Extension Functions এবং Properties কোডকে আরও পরিষ্কার এবং পড়তে সুবিধাজনক করে তোলে।
- Rich Functionality: Kotlin Standard Library বিভিন্ন ফাংশন সরবরাহ করে, যা প্রোগ্রামিংয়ের সময় সাশ্রয় করে এবং কার্যকারিতা বাড়ায়।
উপসংহার
কটলিনের Extensions এবং Standard Library প্রোগ্রামিং ভাষার শক্তিশালী টুল। Extensions আপনাকে বিদ্যমান ক্লাসে নতুন ফাংশন এবং প্রপার্টি যোগ করার সুযোগ দেয়, এবং Standard Library বিভিন্ন বিল্ট-ইন ফাংশন সরবরাহ করে যা দৈনন্দিন কাজকে সহজ করে তোলে। এই ফিচারগুলো ব্যবহার করে আপনি আপনার কোডের কার্যকারিতা এবং রিডেবিলিটি বাড়াতে পারেন।
Extension Functions এবং Properties
কটলিনের Extension Functions এবং Extension Properties একটি ক্লাসের ফাংশন বা প্রপার্টি হিসেবে নতুন আচরণ যুক্ত করার সুবিধা দেয়। এই ফিচারগুলো কোডকে আরও পরিষ্কার, সংক্ষিপ্ত এবং পুনঃব্যবহারযোগ্য করে তোলে। নিচে বিস্তারিতভাবে আলোচনা করা হলো।
১. Extension Functions
Extension Functions কটলিনের একটি বৈশিষ্ট্য যা বিদ্যমান ক্লাসে নতুন ফাংশন যোগ করার অনুমতি দেয়। এটি ক্লাসের অবজেক্ট তৈরি না করেও তাদের উপর ফাংশন কার্যকর করার সুবিধা দেয়।
Syntax:
kotlin
Copy code
fun ClassName.functionName(parameters): ReturnType {
// Function body
}
উদাহরণ:
fun String.reverse(): String {
return this.reversed() // this নির্দেশ করে বর্তমান অবজেক্ট
}
fun main() {
val original = "Kotlin"
val reversed = original.reverse()
println(reversed) // আউটপুট: niltoK
}
ব্যাখ্যা:
- এখানে
Stringক্লাসেreverseনামক একটি extension function তৈরি করা হয়েছে যা একটি স্ট্রিংয়ের অক্ষরগুলোকে বিপরীত করে দেয়। thisকিওয়ার্ডটি বর্তমান অবজেক্টকে নির্দেশ করে।
২. Extension Properties
Extension Properties ক্লাসের নতুন প্রপার্টি যোগ করার একটি উপায়, যদিও এর মান ভ্যালু ধারন করার জন্য কোন ব্যাকিং ফিল্ড নেই। এটি সাধারণত একটি ফাংশনের মাধ্যমে মান প্রদান করে।
Syntax:
val ClassName.propertyName: ReturnType
get() = // Return expression
উদাহরণ:
val String.lastChar: Char
get() = this[this.length - 1]
fun main() {
val str = "Kotlin"
println("The last character is: ${str.lastChar}") // আউটপুট: The last character is: n
}
ব্যাখ্যা:
- এখানে
lastCharনামক একটি extension property তৈরি করা হয়েছে, যাStringক্লাসের শেষ অক্ষর রিটার্ন করে।
৩. Benefits of Extension Functions and Properties
- Readability: কোড পড়তে সহজ হয় কারণ আপনি ক্লাসের প্রকৃত সংজ্ঞা পরিবর্তন না করে নতুন ফাংশন বা প্রপার্টি যোগ করতে পারেন।
- Reusability: একাধিক ক্লাসে একই extension function ব্যবহার করা যায়।
- Separation of Concerns: আলাদা ফাংশনালিটি সংযুক্ত করা যায় যা মূল ক্লাসের সাথে সম্পর্কিত নয়।
৪. Limitations
- Cannot Override: Extension functions এবং properties বিদ্যমান ক্লাসের মেথডগুলোকে ওভাররাইড করতে পারে না।
- Static Resolution: কটলিনে extension functions compile-time এ নির্ধারিত হয়, তাই এটি প্রকৃত অবজেক্টের টাইপের উপর ভিত্তি করে কাজ করে।
৫. Example with Multiple Classes
Extension functions এবং properties একাধিক ক্লাসের জন্যও তৈরি করা যেতে পারে।
fun List<Int>.sum(): Int {
return this.fold(0) { acc, number -> acc + number }
}
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
println("Sum of numbers: ${numbers.sum()}") // আউটপুট: Sum of numbers: 15
}
ব্যাখ্যা:
- এখানে
List<Int>ক্লাসেsumextension function তৈরি করা হয়েছে, যা একটি লিস্টের সব সংখ্যার যোগফল বের করে।
উপসংহার
Extension Functions এবং Extension Properties কটলিনের একটি শক্তিশালী বৈশিষ্ট্য, যা বিদ্যমান ক্লাসে নতুন ফাংশনালিটি যুক্ত করে। এটি কোডকে আরও পরিষ্কার এবং পুনঃব্যবহারযোগ্য করে তোলে। আপনি যখন চাইবেন একটি ক্লাসের কার্যকারিতা বাড়াতে, তখন এই ফিচারগুলো ব্যবহারে আপনি লাভবান হতে পারেন।
Standard Library Functions: let, apply, run, with, also
কটলিনের স্ট্যান্ডার্ড লাইব্রেরিতে কিছু গুরুত্বপূর্ণ এক্সটেনশন ফাংশন রয়েছে, যা অবজেক্টগুলোর সাথে কাজ করার সময় কোডকে আরও সংক্ষিপ্ত, রিডেবল এবং কার্যকর করে। এই ফাংশনগুলো হলো: let, apply, run, with, এবং also। নিচে এই ফাংশনগুলো নিয়ে বিস্তারিত আলোচনা করা হলো:
১. let
let একটি উচ্চ-স্তরের ফাংশন যা একটি অবজেক্টকে প্যারামিটার হিসেবে গ্রহণ করে এবং একটি ব্লক হিসেবে কোড এক্সিকিউট করে। এটি সাধারণত null সেফটি নিশ্চিত করতে ব্যবহৃত হয়।
ব্যবহার:
fun main() {
val name: String? = "Alice"
name?.let {
println("Name is $it") // আউটপুট: Name is Alice
}
}
ব্যাখ্যা:
- এখানে
letব্লকটিnamenull না হলে এক্সিকিউট হবে।$itব্যবহার করেnameভ্যারিয়েবলের মান অ্যাক্সেস করা হয়েছে।
২. apply
apply ফাংশন একটি অবজেক্টকে প্যারামিটার হিসেবে গ্রহণ করে এবং একটি ব্লকে অবজেক্টের প্রপার্টি সেট করতে সাহায্য করে। এটি অবজেক্ট রিটার্ন করে, তাই এটি চেইনিংয়ের জন্য উপকারী।
ব্যবহার:
data class Person(var name: String = "", var age: Int = 0)
fun main() {
val person = Person().apply {
name = "Bob"
age = 25
}
println(person) // আউটপুট: Person(name=Bob, age=25)
}
ব্যাখ্যা:
- এখানে
applyব্যবহার করেPersonঅবজেক্ট তৈরি করা হয়েছে এবং একই সাথেnameএবংageপ্রপার্টি সেট করা হয়েছে।
৩. run
run ফাংশন একটি অবজেক্টকে প্যারামিটার হিসেবে গ্রহণ করে এবং একটি ব্লক হিসেবে কোড এক্সিকিউট করে। এটি ব্লকের শেষে একটি মান রিটার্ন করে, যা সাধারণত প্রোপার্টি সেট করার জন্য ব্যবহৃত হয়।
ব্যবহার:
fun main() {
val result = "Hello".run {
this.length // আউটপুট: 5
}
println(result) // আউটপুট: 5
}
ব্যাখ্যা:
- এখানে
runব্যবহার করে"Hello"স্ট্রিংটির দৈর্ঘ্য রিটার্ন করা হয়েছে।
৪. with
with ফাংশন একটি অবজেক্টকে প্যারামিটার হিসেবে গ্রহণ করে এবং একটি ব্লকে কোড এক্সিকিউট করে। এটি বিশেষভাবে যখন আপনি একটি অবজেক্টের প্রপার্টি বা মেথডের উপর একাধিক অপারেশন করতে চান তখন ব্যবহার করা হয়।
ব্যবহার:
data class Car(var model: String, var year: Int)
fun main() {
val car = Car("Toyota", 2020)
with(car) {
println("Model: $model")
println("Year: $year")
}
}
ব্যাখ্যা:
- এখানে
withব্যবহার করেcarঅবজেক্টেরmodelএবংyearপ্রোপার্টি একসাথে এক্সেস করা হয়েছে।
৫. also
also একটি উচ্চ-স্তরের ফাংশন যা একটি অবজেক্টকে প্যারামিটার হিসেবে গ্রহণ করে এবং একটি ব্লক হিসেবে কোড এক্সিকিউট করে। এটি মূলত অবজেক্টটি পরিবর্তন না করেই কিছু অতিরিক্ত কাজ করার জন্য ব্যবহৃত হয়। এটি অবজেক্টটি রিটার্ন করে।
ব্যবহার:
fun main() {
val numbers = mutableListOf(1, 2, 3)
numbers.also {
println("Original list: $it") // আউটপুট: Original list: [1, 2, 3]
}.add(4)
println(numbers) // আউটপুট: [1, 2, 3, 4]
}
ব্যাখ্যা:
- এখানে
alsoব্যবহার করেnumbersলিস্টের মূল মান প্রিন্ট করা হয়েছে এবং তারপর নতুন আইটেম যোগ করা হয়েছে।
সারাংশ
কটলিনের স্ট্যান্ডার্ড লাইব্রেরির let, apply, run, with, এবং also ফাংশনগুলো ব্যবহার করে আপনি কোডের রিডেবিলিটি এবং কার্যকারিতা বাড়াতে পারেন। এগুলো অবজেক্টগুলির সাথে কাজ করার সময় কোডকে আরো সংক্ষিপ্ত ও পরিষ্কার করে তোলে, এবং কাজের প্রক্রিয়াকে আরও সহজ করে।
Scope Functions এবং তাদের ব্যবহার
কটলিনে Scope Functions হলো একটি শক্তিশালী ফিচার যা একটি অবজেক্টের সাথে কাজ করার জন্য বিভিন্ন ব্লক ব্যবহারের অনুমতি দেয়। Scope Functions যেমন let, run, with, apply, এবং also একসাথে কোড লেখার সময় কার্যকারিতা এবং রিডেবিলিটি বাড়ায়। নিচে এই Scope Functions এবং তাদের ব্যবহার নিয়ে বিস্তারিত আলোচনা করা হলো:
১. let
let ফাংশন একটি অবজেক্টকে একটি লাম্বডা এক্সপ্রেশন হিসেবে গ্রহণ করে এবং সেই অবজেক্টকে it নামে উল্লেখ করা হয়। এটি সাধারণত নাল চেক করার সময় ব্যবহার করা হয়।
উদাহরণ:
val name: String? = "Kotlin"
name?.let {
println("The length of the string is ${it.length}")
}
// আউটপুট: The length of the string is 6
ব্যাখ্যা:
letফাংশন ব্যবহার করেnameনাল না হলেit.lengthরিটার্ন করা হচ্ছে।
২. run
run ফাংশন একটি অবজেক্টের উপর কাজ করার জন্য একটি লাম্বডা এক্সপ্রেশন গ্রহণ করে এবং ফলস্বরূপ অবজেক্টটির রিটার্ন ভ্যালু প্রদান করে। এটি অবজেক্টটির প্রপার্টিগুলিতে অ্যাক্সেসের জন্য সুবিধাজনক।
উদাহরণ:
data class User(var name: String, var age: Int)
fun main() {
val user = User("Alice", 25)
val result = user.run {
age += 1 // age incrementing
"User name is $name and age is $age"
}
println(result) // আউটপুট: User name is Alice and age is 26
}
ব্যাখ্যা:
- এখানে
runফাংশন ব্যবহার করেuserঅবজেক্টের প্রপার্টি পরিবর্তন এবং রিটার্ন ভ্যালু পেয়েছি।
৩. with
with ফাংশন একটি অবজেক্টকে প্রপার্টি এবং মেথডগুলির উপর কাজ করার জন্য সুবিধা দেয়। এটি একটি অবজেক্টকে প্রথম প্যারামিটার হিসেবে গ্রহণ করে এবং দ্বিতীয় প্যারামিটার লাম্বডা হিসেবে কাজ করে।
উদাহরণ:
val user = User("Bob", 30)
val description = with(user) {
"Name: $name, Age: $age"
}
println(description) // আউটপুট: Name: Bob, Age: 30
ব্যাখ্যা:
- এখানে
withফাংশন ব্যবহার করেuserঅবজেক্টের প্রপার্টিতে সরাসরি অ্যাক্সেস করা হয়েছে।
৪. apply
apply ফাংশন একটি অবজেক্টের জন্য সেটআপ করার সময় ব্যবহৃত হয়। এটি অবজেক্টকে একটি লাম্বডা এক্সপ্রেশন হিসেবে গ্রহণ করে এবং অবজেক্টকে রিটার্ন করে। এটি সাধারণত অবজেক্ট ইনিশিয়ালাইজেশনের জন্য ব্যবহৃত হয়।
উদাহরণ:
val user = User("Charlie", 20).apply {
age += 1 // age incrementing
}
println(user) // আউটপুট: User(name=Charlie, age=21)
ব্যাখ্যা:
- এখানে
applyফাংশন ব্যবহার করেuserঅবজেক্টেরageপ্রপার্টি পরিবর্তন করা হয়েছে এবং পুরো অবজেক্ট রিটার্ন করা হয়েছে।
৫. also
also ফাংশন একটি অবজেক্টকে একটি লাম্বডা এক্সপ্রেশন হিসেবে গ্রহণ করে, যা it হিসেবে উল্লেখ করা হয়, এবং অবজেক্টকে রিটার্ন করে। এটি সাধারণত লোগিং বা ডিবাগিংয়ের জন্য ব্যবহৃত হয়।
উদাহরণ:
val number = 10
number.also {
println("The number is: $it")
}.let {
println("Double of number is: ${it * 2}")
}
// আউটপুট:
// The number is: 10
// Double of number is: 20
ব্যাখ্যা:
- এখানে
alsoফাংশন ব্যবহার করেnumberভ্যারিয়েবলের মান লগ করা হয়েছে এবং পরেletএর মাধ্যমে দ্বিগুণ মান রিটার্ন করা হয়েছে।
উপসংহার
কটলিনের Scope Functions (যেমন let, run, with, apply, এবং also) কোড লেখার সময় কার্যকারিতা এবং রিডেবিলিটি বাড়াতে সাহায্য করে। এগুলো অবজেক্টের প্রপার্টিতে সহজে অ্যাক্সেস করতে এবং অপারেশন সম্পাদন করতে সহায়ক। আপনি যখন এগুলো ব্যবহার করবেন, তখন আপনার কোড আরও পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য হবে।
Kotlin এর Built-in Utility Functions
কটলিনে অনেক ধরনের বিল্ট-ইন ইউটিলিটি ফাংশন রয়েছে, যা প্রোগ্রামিং কাজকে সহজ এবং কার্যকরী করে তোলে। এই ফাংশনগুলো বিভিন্ন কাজের জন্য ব্যবহৃত হয়, যেমন স্ট্রিং ম্যানিপুলেশন, কালেকশন হ্যান্ডলিং, ফাইল অপারেশন ইত্যাদি। নিচে কটলিনের কিছু গুরুত্বপূর্ণ বিল্ট-ইন ইউটিলিটি ফাংশন সম্পর্কে আলোচনা করা হলো।
১. String Utility Functions
i) isNullOrEmpty()
এই ফাংশনটি চেক করে যে একটি স্ট্রিং null অথবা খালি কিনা।
val str: String? = null
println(str.isNullOrEmpty()) // আউটপুট: true
ii) isNullOrBlank()
এটি চেক করে যে একটি স্ট্রিং null, খালি বা শুধুমাত্র স্পেস থাকলে।
val str: String? = " "
println(str.isNullOrBlank()) // আউটপুট: true
iii) trim()
এটি স্ট্রিংয়ের আগে এবং পরে থাকা স্পেস সরিয়ে দেয়।
val str = " Hello, Kotlin! "
println(str.trim()) // আউটপুট: Hello, Kotlin!
২. Collection Utility Functions
i) filter()
এই ফাংশনটি একটি কালেকশনের উপাদানগুলোকে একটি শর্ত অনুযায়ী ফিল্টার করে এবং নতুন একটি কালেকশন রিটার্ন করে।
val numbers = listOf(1, 2, 3, 4, 5)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // আউটপুট: [2, 4]
ii) map()
এই ফাংশনটি একটি কালেকশনের প্রতিটি উপাদানের উপর একটি অপারেশন প্রয়োগ করে এবং একটি নতুন কালেকশন রিটার্ন করে।
val numbers = listOf(1, 2, 3)
val squares = numbers.map { it * it }
println(squares) // আউটপুট: [1, 4, 9]
iii) reduce()
এই ফাংশনটি একটি কালেকশনের উপাদানগুলোকে একটি একক মানে রিডিউস করে।
val sum = numbers.reduce { acc, number -> acc + number }
println(sum) // আউটপুট: 6
৩. Sequence Utility Functions
i) asSequence()
একটি কালেকশনকে Sequence তে রূপান্তর করে, যা লেজি লোডিং (lazy loading) সমর্থন করে।
val numbers = (1..1000).asSequence()
val evenNumbers = numbers.filter { it % 2 == 0 }.take(5).toList()
println(evenNumbers) // আউটপুট: [2, 4, 6, 8, 10]
৪. I/O Utility Functions
i) readText()
ফাইলের সমস্ত কনটেন্ট পড়তে এই ফাংশনটি ব্যবহৃত হয়।
import java.io.File
fun main() {
val content = File("example.txt").readText()
println(content)
}
ii) writeText()
ফাইলে নতুন কনটেন্ট লিখতে ব্যবহৃত হয়।
import java.io.File
fun main() {
File("example.txt").writeText("Hello, Kotlin!")
}
৫. Other Utility Functions
i) with()
এই ফাংশনটি একটি অবজেক্টের উপর একটি ব্লক চালাতে ব্যবহৃত হয়।
data class Person(var name: String, var age: Int)
fun main() {
val person = Person("Alice", 25)
with(person) {
println("Name: $name, Age: $age")
}
}
ii) let()
এই ফাংশনটি null চেক করার জন্য এবং একটি স্কোপে ভ্যারিয়েবলের উপর কাজ করার জন্য ব্যবহৃত হয়।
val name: String? = "Kotlin"
name?.let {
println("Name is: $it")
}
iii) also()
এই ফাংশনটি একটি অবজেক্টের সাথে কিছু অপারেশন করার জন্য ব্যবহৃত হয় এবং মূল অবজেক্ট রিটার্ন করে।
val numberList = mutableListOf(1, 2, 3).also { println("List before addition: $it") }
numberList.add(4)
println("List after addition: $numberList") // আউটপুট: List after addition: [1, 2, 3, 4]
উপসংহার
কটলিনের বিল্ট-ইন ইউটিলিটি ফাংশনগুলো আপনার কোডের কার্যকারিতা ও পাঠযোগ্যতা বাড়ায়। এই ফাংশনগুলো বিভিন্ন কাজ যেমন স্ট্রিং ম্যানিপুলেশন, কালেকশন হ্যান্ডলিং, এবং ফাইল অপারেশন সহজ করে তোলে। এই ফাংশনগুলোর সঠিক ব্যবহার আপনার কোডকে আরও মডুলার এবং কার্যকর করবে।
Read more