Codeit Mobile
94 subscribers
3 photos
1 video
243 links
📱 آموزش برنامه‌نویسی موبایل

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
عملگر الویس (?:) در Kotlin جایگزین کوتاه برای if-else است.
🔹 کاربرد: وقتی یک مقدار nullable داریم، اگر نال نبود استفاده می‌شود وگرنه مقدار پیش‌فرض.
🔸 مثال:
val name: String? = null
val result = name ?: "مهمان"
نتیجه: "مهمان" (چون name نال بود).
🔹 نکته: عملگر الویس همیشه مقدار غیرنال برمی‌گرداند.
🔸 ترکیب با let:
name?.let { print(it) } ?: print("نال")
📌 مناسب برای زنجیره‌سازی و کاهش کد.
💡 به‌جای if-else طولانی از این عملگر استفاده کن.
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔹 تو کاتلین دو نوع Type Cast داریم: safe cast با as? و unsafe با as
🔹 اگه از as استفاده کنی و نوع نادرست باشه، برنامه کرش میکنه! 💥
🔹 اما as? اگه نادرست باشه، null برمیگردونه و خطا نمیده
🔹 برای چک کردن نوع از is و !is استفاده کن
🔹 بعد از چک با is، نیازی به cast مجدد نداری (Smart Cast) 🤖
🔹 مثال:
val x: Any = "Hello"  
if (x is String) println(x.length) // Smart Cast

🔹 از as? برای جلوگیری از ClassCastException استفاده کن
🔹 همیشه قبل از cast مطمئن شو نوع درسته یا از safe cast استفاده کن
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🚀 تو کاتلین، if دیگه فقط یه شرط ساده نیست!
یه عبارت (Expression) هست که میتونه مقدار برگردونه.

🔹 مثلاً به جای نوشتن if-else جدا، مستقیم مقدار توی متغیر ذخیره کن:
val max = if (a > b) a else b


🔸 دیگه نیاز به عملگر سه‌تایی (ternary) نداری!
🔹 if میتونه چند خط بدنه داشته باشه و آخرین خط رو برمی‌گردونه.

📌 نکته: برای شروط چندبخشی، از if-else if به صورت زنجیره‌ای استفاده کن.
کد خواناتر و جمع‌وجورتر از جاوا میشه.

🎯 یه نکته حرفه‌ای: ترکیب if با functionها برای منطق پیچیده‌تر عالیه.

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔥 When Expression در کاتلین، یه جایگزین قدرتمند برای switch جاواست!
💡 می‌تونه به‌عنوان یه عبارت (Expression) استفاده بشه و مقدار برگردونه.
سینتکس ساده و خوانا:
val result = when (x) {
1 -> "One"
2 -> "Two"
else -> "Unknown"
}

بدون نیاز به break، فقط شرط‌ها رو بررسی می‌کنه.
🔍 حتی می‌تونه بازه‌ها (Range) رو هم چک کنه:
when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
else -> "C"
}

🎯 برای مبتدی‌ها سوئیچینگ منطقی رو ساده‌تر و خواناتر می‌کنه.
🚀 همین حالا تو پروژه‌هات ازش استفاده کن!

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔁 حلقه for در کاتلین، ساده‌ترین راه برای تکرار یه بلوک کده 😎

📌 ساختار پایه: for (item in collection) { ... }

🎯 می‌تونی از range استفاده کنی: for (i in 1..5)

💡 حتی می‌تونی مرحله رو تنظیم کنی: for (i in 1..10 step 2)

🧩 تکرار روی لیست یا آرایه هم مثل آب خوردن: for (name in names)

🔥 با destructing declaration هم جفت میشه: for ((index, value) in list.withIndex())

🛠️ while و do-while هم هست، ولی for خواناترین گزینه‌ست

📚 یادش بگیر، بعد تو پروژه‌هات ازش استفاده کن

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔁 حلقه while در کاتلین – تکرار تا وقتی که شرط درسته!

وقتی تعداد تکرار نامشخصه، while رو استفاده کن
📝 ساختار ساده:
var i = 0
while (i < 5) {
println(i)
i++
}

🔄 تا وقتی شرط true باشه، بدنه اجرا میشه
⚠️ حواست به بی‌نهایت شدن loop باشه!
💡 می‌تونی از do-while هم استفاده کنی که حداقل یک بار اجرا بشه

🎯 مثال واقعی: منتظر ورود کاربر موندن تا شرط برآورده بشه

📌 مبحث پایه ولی فوق‌العاده کاربردی برای کنترل جریان برنامه

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔹 توابع در Kotlin – اولین قدم برای کد نویسی تمیز! 🚀

1️⃣ تعریف تابع با fun شروع میشه:
fun greet(): String { return "Hello" }

2️⃣ نوع برگشتی رو مشخص کن، حتی اگه Unit (void) باشه! 🎯

3️⃣ پارامترها رو با اسم و نوع بنویس:
fun sum(a: Int, b: Int): Int = a + b

4️⃣ توابع تک‌خطی رو با = بنویس، نیازی به return نیست!

5️⃣ آرگومان‌های پیش‌فرض (default) خیلی به‌دردبخورن:
fun greet(name: String = "User") { ... }

6️⃣ توابع رو می‌تونی داخل کلاس یا مستقل تعریف کنی – انعطاف‌پذیر 😎

7️⃣ یادت باشه: هر تابع یه کار خاص انجام بده (SRP)

8️⃣ مثال سریع:
fun isEven(n: Int) = n % 2 == 0

🔥 همین الان تمرین کن و کد مرتب‌تر بنویس!

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔹 توابع در کاتلین قلب برنامه‌نویسی‌اند! 🚀
🔹 یه تابع کار خاصی رو انجام میده و کدت رو خواناتر و قابل استفاده‌تر میکنه.
🔹 syntax ساده‌اش: fun name() { ... } 😎
🔹 می‌تونه ورودی بگیره (param) و خروجی بده (return).
🔹 حتی می‌تونه یه مقدار پیش‌فرض به پارامترها بده!
🔹 مثال: fun greet(name: String = "World")
🔹 توابع خط‌تکی با = هم مینویسی: fun sum(a: Int, b: Int) = a + b
🔹 اینطوری کدت جمع‌وجورتر و خواناتر میشه.
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔷 کلاس‌ها در کاتلین 🚀

🔹 کلاس‌ها قلب برنامه‌نویسی شی‌گرا در کاتلین هستند.
🔹 فرق بین data class و sealed class رو می‌دونی؟ 🧐
🔹 data class خودش toString، equals و hashCode رو می‌سازه!
🔹 sealed class برای محدود کردن سلسله‌مراتب کلاس‌ها عالیه.
🔹 از object برای singleton‌های ساده استفاده کن.
🔹 کلاس‌های تو در تو (nested class) با inner class فرق دارن.
🔹 companion object جایگزین static memberهای جاواست.
🔹 حواست به visibility modifiers (private, internal) باشه.

🐍 کلاس‌های کاتلین رو قورت بده!
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔵 آبجکت‌ها در کاتلین؛ فراتر از کلاس‌های معمولی!

۱️⃣ object یعنی تعریف یک singleton بدون دردسر 🧩
۲️⃣ companion object جایگزین اعضای static در جاوا 🚀
۳️⃣ object expression ساخت anonymous object در لحظه 🎯
۴️⃣ داخل companion می‌تونی از const val برای ثابت‌ها استفاده کنی 🧮
۵️⃣ با object دیگه نیازی به الگوی Singleton نخواهی داشت 🙌
۶️⃣ همچنین میشه از آبجکت‌ها به عنوان delegate برای delegation استفاده کرد 🧠
۷️⃣ نکته: companion object می‌تونه نام داشته باشه یا anonymous باشه 📌

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
اشیاء در کاتلین فراتر از اشیاء ساده هستند! 🎯
🔹 object برای تعریف singleton بدون نیاز به کلاس اضافی
🔹 companion object برای اعضای استاتیک مثل جاوا، اما خواناتر
🔹 object expression برای ایجاد anonymous object درجا
🔹 همه اینها در سطح باینری بهینه و thread-safe هستند
🔹 مثال: object NetworkConfig { ... } یک نمونه سراسری
🔹 نکته: companion object در واقع یک شیء تو در توست، نه static واقعی
🔹 اشیاء می‌توانند از کلاس‌ها و اینترفیس‌ها ارث برند
⚡️ با این ابزارها کد تمیزتر و بدون boilerplate می‌نویسید
📚 این مبحث پایه‌ای برای الگوهای طراحی در کاتلینه
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🔷 مفهوم ارث‌بری (Inheritance) در Kotlin – سطح متوسط 🧬

ارث‌بری یکی از مفاهیم اصلی شیء‌گراییه که به شما اجازه میده کلاس‌های جدیدی بر پایه کلاس‌های موجود بسازید.
در Kotlin، کلاس‌ها به‌طور پیش‌فرض final هستند و برای ارث‌بری باید با کلیدواژه open مشخص بشن.

مثال عملی: فرض کنید یک کلاس پایه Animal داریم:

open class Animal(val name: String) {
open fun sound() = "Some sound"
}


حالا یک کلاس Cat از آن ارث می‌بریم:

class Cat(name: String) : Animal(name) {
override fun sound() = "Meow"
}


در اینجا open اجازه override متد sound رو میده.
سازنده کلاس والد با : Animal(name) صدا زده میشه.

🔸 نکات مهم:
- برای override حتماً از override استفاده کنید.
- اگر کلاس والد سازنده بدون پارامتر نداره، باید پارامترها رو پاس بدید.
- ارث‌بری چندگانه نداریم (ترجیحاً از interface استفاده کنید).

🔹 مثال پیشرفته‌تر: استفاده از super برای دسترسی به متد والد:

open class Dog(name: String) : Animal(name) {
final override fun sound() = "Woof" // متد نهایی
}


این کد نشون میده که با final می‌شه از override مجدد جلوگیری کرد.

📌 ارث‌بری رو در پروژه‌های واقعی برای باز استفاده از کد و اعمال چندریختی (Polymorphism) به کار ببرید.

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
📌 اینترفیس‌های Kotlin رو جدی بگیر؛ اگه فقط با کلاس‌های abstract کار کردی، نصف راه رو رفتی!

اینترفیس‌ها قراردادهای قدرتمندی هستن که بدون وابستگی به سلسله‌مراتب، رفتار رو تعریف می‌کنن.
💡 توی یک اپ واقعی، مثلاً می‌خوای انواع مختلف پرداخت (کارت، کیف پول، رمزارز) رو مدیریت کنی.

📌 هر سرویس پرداخت باید متد pay(amount) رو داشته باشه. با اینترفیس یه قرارداد می‌بندی و پیاده‌سازی رو به کلاس‌ها می‌سپاری.

👇 نمونه کد ساده اما کاربردی:

interface PaymentService {
fun pay(amount: Double): String
fun validate(): Boolean
}

class CardPayment : PaymentService {
override fun pay(amount: Double): String {
return "پرداخت $amount با کارت انجام شد."
}
override fun validate(): Boolean {
// اعتبارسنجی شماره کارت
return true
}
}

class WalletPayment : PaymentService {
override fun pay(amount: Double): String {
return "پرداخت $amount از کیف پول انجام شد."
}
override fun validate(): Boolean {
// بررسی موجودی
return true
}
}


اینترفیس بهت انعطاف می‌ده: می‌تونی هر کلاس جدیدی بدون تغییر کد قبلی اضافه کنی.
💡 بهترین تمرین: برای هر «قابلیت» در اپت یه اینترفیس در نظر بگیر، بعد dependency injection رو استفاده کن.

#Kotlin #Interface #AndroidDev #CleanArchitecture #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
📦 Data Class در کاتلین چیزی فراتر از یک کلاس ساده است!
وقتی از data class استفاده می‌کنی، کاتلین خودش متدهای toString، equals، hashCode، copy و componentN رو می‌سازه.

🧩 مشکل: تو پروژه‌های بزرگ مجبوری بارها کد تکراری برای مدل‌ها بنویسی.
راه‌حل: data class با یه خط کد تمام این کارها رو برات انجام میده.

🔄 یک مثال واقعی: مدل کاربر با فیلدهای nullable و نیاز به کپی کردن یه مقدار تغییر یافته.

🧪 کد عملی:
data class User(
val id: Int,
val name: String,
val email: String?,
val isActive: Boolean = true
)

fun main() {
val original = User(1, "Ali", "ali@example.com", true)
val updated = original.copy(email = null, isActive = false)
println(original) // User(id=1, name=Ali, email=ali@example.com, isActive=true)
println(updated) // User(id=1, name=Ali, email=null, isActive=false)

// Destructuring
val (id, name, email) = updated
println("$id - $name - $email") // 1 - Ali - null
}


📋 توضیح:
- copy() بدون تغییر فیلدهای دیگه، یه نمونه جدید با فیلدهای دلخواه می‌سازه.
- Destructuring به کمک componentN کار میکنه و کد خوندنی‌تری میده.

🚀 نکته حرفه‌ای:
از data class فقط برای نگهداری داده استفاده کن (نه منطق سنگین).
برای حفظ immutability فیلدها رو با val تعریف کن.

#DataClass #KotlinTips #CleanCode #Destructuring #Model #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔹 تا حالا خواستی یه مجموعه ثابت از مقادیر رو توی کاتلین مدیریت کنی؟
🔸 Enum Class دقیقاً برای همینه! یه نوع خاص از کلاس که مقادیر از پیش تعریف‌شده داره و می‌تونه رفتار اختصاصی هم داشته باشه.

🔹 فرض کن قراره وضعیت‌های یه سفارش رو مدل کنی: Pending, Shipped, Delivered.
🔸 بدون Enum مجبوری از String یا Int استفاده کنی و خطاهای انسانی زیاد میشه. اما Enum کلاس اون رو تایپ-سیف و خواناتر می‌کنه.

🔹 Enum توی کاتلین خیلی فراتر از یه لیست ساده‌ست:
🔸 می‌تونه پراپرتی داشته باشه، متد داشته باشه، حتی اینترفیس implement کنه.

🔹 مثال عملی: یه ماشین‌حالت ساده برای پردازش سفارش با انتقال بین وضعیت‌ها:

enum class OrderStatus(val label: String) {
Pending("در انتظار تأیید"),
Shipped("ارسال شده"),
Delivered("تحویل داده شده"),
Cancelled("لغو شده");

fun canTransitionTo(next: OrderStatus): Boolean {
return when (this) {
Pending -> next == Shipped || next == Cancelled
Shipped -> next == Delivered
else -> false
}
}
}

fun main() {
val current = OrderStatus.Pending
println(current.label) // در انتظار تأیید
println(current.canTransitionTo(OrderStatus.Shipped)) // true
}


🔹 این کد نشون میده که هر وضعیت یه label (برچسب فارسی) داره و منطق انتقال مجاز بین وضعیت‌ها رو توی متد canTransitionTo تعریف کردیم.
🔸 مزیت: خطای انسانی کم میشه، کد خوانا و قابل نگهداری‌ست.

🔹 یه نکته حرفه‌ای: از Enum برای ثابت‌هایی که رفتار متفاوت دارن استفاده کن (مثل Strategy Pattern ساده).
🔸 از when به جای if-های طولانی استفاده کن تا کد تمیز بمونه.

#EnumClass #Kotlin #کاتلین #برنامه‌نویسی #Android #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1
🧩 آیا تا به حال شده که بخوای یه وضعیت خاص رو توی کدهات مدیریت کنی ولی enum جواب نده؟
بیا با Sealed Class آشنا بشیم؛ یه ابزار قدرتمند توی Kotlin برای تعریف محدودیت‌های دقیق روی نوع‌ها.

📦 Sealed Class چیه؟
یه کلاس که زیرکلاس‌هاش فقط توی همون فایل یا package تعریف میشن. این یعنی کامپایلر همه‌ی حالت‌های ممکن رو می‌دونه و می‌تونه exhaustive بودن when رو تضمین کنه.

کاربرد واقعی: مدیریت stateهای مختلف یه صفحه (Loading, Success, Error).
به‌جای if/else بی‌نظم، از sealed class استفاده کن تا کدت خواناتر و مطمئن‌تر بشه.

🔧 بیایید یه مثال ساده ببینیم:

sealed class UiState {
object Loading : UiState()
data class Success(val data: String) : UiState()
data class Error(val message: String) : UiState()
}

fun handleState(state: UiState) {
when (state) {
is UiState.Loading -> println("در حال بارگذاری... 🌀")
is UiState.Success -> println("داده دریافت شد: ${state.data} ")
is UiState.Error -> println("خطا: ${state.message} ")
}
}


💡 این کد چیکار میکنه؟
سه حالت ممکن رو با sealed class تعریف کردیم. when exhaustive هست و نیازی به else نداره. اگه بعداً یه حالت جدید اضافه کنی، کامپایلر اخطار میده که باید مدیریتش کنی.

🚀 نکته‌ی کاربردی:
از sealed class برای Representation‌های محدود (مثلا نوع خطاها، نتیجه‌ی API، یا ناوبری صفحه‌ها) استفاده کن. این کار type safety رو افزایش میده و کدت رو پیش‌بینی‌پذیرتر میکنه.

#SealedClass #Kotlin #Android #Jetpack #کدایت #Codeit #AndroidDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
توابع الحاقی (Extension Functions) تو کاتلین، یه قابلیت جادویی‌ان که بهت اجازه میدن بدون ارث‌بری یا تغییر کلاس، متد جدید بهش اضافه کنی! 🪄

🧠 فرض کن یه کلاس از کتابخونه‌ی شخص ثالث داری و میخوای یه متد خاص روش پیاده‌سازی کنی. با Extension Functions میتونی انگار که اون متد جزو کلاس اصلیه، ازش استفاده کنی.

📱 مثال واقعی: فرض کن میخوای یه String رو به صورت URL-safe encode کنی، ولی متد آماده نداره. میتونی یه Extension Function بنویسی:

fun String.toUrlSafe(): String {
return this.replace(" ", "%20")
.replace("?", "%3F")
.replace("&", "%26")
}

// استفاده
val unsafe = "hello world?query=test&item=1"
val safe = unsafe.toUrlSafe()
println(safe) // hello%20world%3Fquery%3Dtest%26item%3D1


این کد یه متد جدید به اسم toUrlSafe به String اضافه میکنه. درون خودش با this به رشته‌ی اصلی دسترسی داری و جای کاراکترهای خاص رو با کدهای URL می‌ذاره.

🎯 نکته: Extension Functions静态 (static) هستن و override نمی‌شن. اگر کلاس همون متد رو داشته باشه، اولویت با متد اصلیه.

🔥 بهترین تمرین: از Extension Functions برای جدا کردن منطق کمکی از کلاس‌های اصلی استفاده کن، مخصوصاً برای Utility functions.

#ExtensionFunctions #KotlinTips #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔍 توابع scope در Kotlin ابزاری قدرتمند برای مدیریت context اشیاء هستن، اما استفاده نادرست ازشون کد رو پیچیده می‌کنه. بیا با مثال ساده یاد بگیریم! 🚀

توابع scope (let, run, with, apply, also) بهت اجازه می‌دن عملیات روی یک شیء رو داخل یه بلاک محدود انجام بدی. فرق اصلیشون در نتیجه برگشتی و نحوه دسترسی به شیء هست (با it یا this). 🧩

مثال واقعی: فرض کن یه User داری و می‌خوای مقادیرش رو ببینی، تغییر بدی و بعد validation کنی. با apply و let می‌تونی خیلی خواناتر بنویسی.

📌 کد مثال:
data class User(var name: String, var email: String)

fun main() {
val user = User("", "")

user.apply {
name = "Sara"
email = "sara@example.com"
}.let {
println("User created: ${it.name}, ${it.email}")
// validation
if (it.email.contains("@")) it else null
}?.run {
println("Valid user: $name")
} ?: println("Invalid email")
}


توضیح کد:
- apply مقادیر رو تنظیم می‌کنه و خود شیء رو برمی‌گردونه.
- let با it به شیء دسترسی داره و نتیجه آخر رو برمی‌گردونه (اینجا null یا خود شیء).
- run روی شیء غیر null اجرا میشه و با this کار می‌کنه.

نکته کاربردی:
برای زنجیره‌سازی عملیات بدون متغیرهای موقت، از apply برای تنظیم و let برای پردازش استفاده کن. از also برای side-effects (مثل لاگ) استفاده کن.

🏷️ #Scope #Kotlin #ScopeFunctions #کاتلین #JVM #AndroidDev
#Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
📌 می‌دونی چرا کلکسیون‌های Kotlin محبوب‌ترین ابزار هر دولوپر اندروید هستن؟ 🚀

📚 تو دنیای واقعی، داده‌ها به صورت لیست، ست یا مپ ذخیره می‌شن. Kotlin با extension function‌های قدرتمندش مثل map و filter کار رو خیلی راحت کرده. فرض کن یه لیست از یوزرها داری و می‌خوای فقط اسم اون‌هایی که سنشون بالای ۱۸ هست رو نشون بدی. 🎯

🛠️ بیا با یه مثال عملی ببینیم چطور میشه از filter و map استفاده کرد:

data class User(val name: String, val age: Int)

val users = listOf(
User("Ali", 22),
User("Sara", 17),
User("Reza", 30)
)

val adultNames = users
.filter { it.age >= 18 }
.map { it.name }

println(adultNames) // [Ali, Reza]


کد بالا اول کاربران بالای ۱۸ رو فیلتر می‌کنه و بعد فقط اسمشون رو استخراج می‌کنه. این ترکیب از کلکسیون‌ها باعث میشه کدت خواناتر و دیباگش راحت‌تر باشه.

💡 نکته حرفه‌ای: همیشه از sequence برای داده‌های بزرگ استفاده کن تا عملکرد بهتری داشته باشی. asSequence() رو یادت نره!

#Kotlin #Collections #Filter #Map #Sequence #Codeit #کدایت #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🚀 تابع‌های بی‌نام (Lambda) توی کاتلین مثل یه ابزار جادویی‌ان که باعث می‌شن کدت خواناتر و کوتاه‌تر بشه.
📌 لامبدا یه بلاک کد هست که می‌تونی به‌عنوان آرگومان به توابع دیگه بدی.

💡 مثلاً توی لیست‌ها، به‌جای نوشتن حلقه‌ی کامل، از filter و map با لامبدا استفاده می‌کنی:

val numbers = listOf(1, 2, 3, 4, 5, 6)
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // خروجی: [2, 4, 6]


🧠 اینجا it همون عنصر جاری لیست هست. لامبدا رو با {} تعریف می‌کنیم و آخرین عبارت داخلش مقدار برگشتی محسوب می‌شه.

⚙️ یه مثال عملی: توی پروژه‌های Jetpack Compose خیلی از لامبدا استفاده می‌کنی:

Button(onClick = { 
// کاری که باید با کلیک انجام بشه
println("دکمه کلیک شد!")
}) {
Text("کلیک کن")
}


لامبداها کدتو جمع‌وجور می‌کنن و وابستگی به کلاس‌های مجزا رو کم می‌کنن.
📝 نکته: از لامبدا فقط برای عملیات کوتاه استفاده کن؛ برای منطق پیچیده‌تر تابع جدا بنویس.

#Lambda #Kotlin #FunctionalProgramming
#Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🎯 تابع‌های مرتبه بالا (Higher-Order Functions) رو قورت بده!
دیگه نیازی نیست کلی حلقه تکراری بنویسی. 🚀

🌀 تابع مرتبه بالا یعنی تابعی که ورودیش یک تابع دیگه‌ست یا خروجیش یک تابع برمی‌گردونه.
مثلاً می‌تونی باهاش منطق رو از تابع اصلی جدا کنی و کد رو خواناتر و ماژولارتر بنویسی.

کاربرد واقعی:
فرض کن داری یه پردازش روی لیست محصولات انجام میدی. گاهی نیاز داری فیلتر کنی، گاهی مرتب کنی، گاهی نقشه (map) بکشی.
به جای نوشتن تابع جدا برای هر کدوم، یه تابع مرتبه بالا می‌نویسی که منطق رو به عنوان پارامتر دریافت کنه.

🔧 مثال عملی با Kotlin:

data class Product(val name: String, val price: Int)

fun List<Product>.customFilter(predicate: (Product) -> Boolean): List<Product> {
val result = mutableListOf<Product>()
for (item in this) {
if (predicate(item)) {
result.add(item)
}
}
return result
}

// استفاده
val products = listOf(
Product("Laptop", 1500),
Product("Mouse", 25),
Product("Keyboard", 80)
)

val expensiveProducts = products.customFilter { it.price > 100 }
println(expensiveProducts) // [Product(name=Laptop, price=1500)]


💡 توضیح کد:
- customFilter یه تابع مرتبه بالاست که یک predicate (تابع Boolean) می‌گیره.
- داخل بدنه لیست رو پیمایش می‌کنه و اونایی که شرط رو دارند برمی‌گردونه.
- خیلی شبیه filter خود Kotlin هستش، ولی اینجا خودت پیاده‌سازی کردی.

📌 نتیجه‌گیری و نکته حرفه‌ای:
تابع‌های مرتبه بالا باعث می‌شوند کدت قابل استفاده مجدد و انعطاف‌پذیر بشه.
همیشه سعی کن منطق تکراری رو به صورت lambda یا reference به تابع بدی به جای تکرار حلقه‌ها.

#Kotlin #HigherOrderFunctions #Codeit #Android #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile