Lambda، Higher-Order و Extension؛ ادویههای حرفهای
اینجا کدت کمکم از «کار میکنه» میرسه به «خوشگل هم کار میکنه».
Lambda یعنی تابع کوچولوی بیاسم
لامبدا برای وقتی عالیه که یه رفتار کوچیک رو همونجا تعریف میکنی. مثلاً برای filter و map. اسم نمیخواد؛ مثل مهمون ناخوانده میاد کارشو میکنه میره.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
val numbers = listOf(1, 2, 3, 4)
val doubled = numbers.map { number -> number * 2 }
println(doubled)
[2, 4, 6, 8]
Higher-order function
تابعی که تابع بگیره یا تابع برگردونه، higher-order حساب میشه. این ستون فقرات خیلی از APIهای کاتلین و Composeه.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
fun main() {
val result = calculate(4, 5) { x, y -> x + y }
println(result)
}
9
Extension function
با extension میتونی به یک نوع موجود، تابع اضافه کنی بدون اینکه کلاس اصلی رو دستکاری کنی. مثل اینکه به ماشینت اسپویلر بزنی، بدون اینکه کارخانه رو بخری.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
fun String.toFriendlyTitle(): String {
return trim().replaceFirstChar { it.uppercase() }
}
fun main() {
println(" kotlin ".toFriendlyTitle())
}
Kotlin
Scope functions
`let`, `run`, `with`, `apply`, `also` برای کارهای تمیز با آبجکتها هستن. زیاد استفاده کنی کدت جادویی و گیجکننده میشه؛ اندازه نگه دار.
مثال را با چند مقدار دیگر هم امتحان کن؛ چون برنامهنویسی با نگاه کردن یاد گرفته نمیشود، با خراب کردن و درست کردن جا میافتد.
data class User(var name: String = "", var age: Int = 0)
val user = User().apply {
name = "Mina"
age = 25
}
User(name=Mina, age=25)
نتیجه این درس 🎯
Lambda، higher-order و extension باعث میشوند Kotlin خوشدست و خوشخوان شود. ولی زیادهروی نکن؛ هدف تمیز شدن کد است، نه شعبدهبازی.
تمرین! 🧠
یک extension function برای Int بنویس که بگوید عدد زوج است یا نه.
fun Int.isEven(): Boolean = this % 2 == 0
fun main() {
println(10.isEven())
println(7.isEven())
}
true false