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

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
🚀 تابع‌های بی‌نام (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
📚 Collections در Kotlin رو قورت بده!
اگه تا حالا باهاشون کار کردی، وقتشه بری سطح بالاتر. 🚀

Collection یعنی یه محفظه برای نگهداری یه دسته داده. تو Kotlin به سه شکل اصلی میان:
- List (مرتب و قابل تکرار)
- Set (غیرمرتب و بدون تکرار)
- Map (کلید-مقدار)

اما اون چیزی که واقعاً کدتو خفن می‌کنه، استفاده از extension functions و lambda هاست. مثلاً فیلتر کردن یه لیست با یه خط کد:

val numbers = listOf(1, 2, 3, 4, 5, 6)
val evens = numbers.filter { it % 2 == 0 }
println(evens) // [2, 4, 6]


🧠 بالاتر از این، transforming و aggregation رو یاد بگیر:
map, flatMap, groupBy, reduce, fold...

مثال کاربردی:

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

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

val names = users.map { it.name }
val groupedByAge = users.groupBy { it.age > 25 }


این کد با map اسم همه رو جدا می‌کنه و با groupBy کاربرا رو بر اساس سن دسته‌بندی می‌کنه.

💡 نکته حرفه‌ای: همیشه از immutable collections (مثل listOf) استفاده کن مگر اینکه واقعاً نیاز به تغییر بعد از ساخت داشته باشی. این کار باعث کاهش باگ و افزایش خوانایی می‌شه.

🔥 تمرین امروز: یه لیست از متن‌ها بگیر، با filter اونایی که طولشون بیشتر از ۵ کاراکتر هست رو نگه دار، و با map همه‌شون رو به حروف بزرگ تبدیل کن. کدت رو توی کامنت بذار!

#Collections #Kotlin #List #Set #Map #FunctionalProgramming #Codeit #Android #Kotlin #Jetpack
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1
🔹 توابع محلی در «Kotlin» : کجا تعریفشون کنیم تا کد تمیزتری داشته باشیم؟ 🤔

🔸 گاهی توی یه تابع بزرگ، چند خط کد تکراری داریم که فقط همون جا استفاده میشن. اینجا به جای درست کردن یه تابع جدا تو سطح کلاس، میتونیم از توابع محلی (Local Functions) استفاده کنیم.

🔹 یه تابع محلی داخل بدنه تابع اصلی تعریف میشه و فقط همونجا قابل دسترسیه. این کار باعث میشه کد خواناتر بشه و از آلودگی فضای کلاس جلوگیری کنه.

🔸 مثال کاربردی: اعتبارسنجی ورودی‌های کاربر قبل از ثبت‌نام. به جای نوشتن شرط‌های تکراری، یه تابع محلی میسازیم:

fun registerUser(name: String, email: String, age: Int) {
fun validateInput(input: String, fieldName: String) {
if (input.isBlank()) {
throw IllegalArgumentException("$fieldName cannot be blank")
}
}

validateInput(name, "Name")
validateInput(email, "Email")
println("User registered successfully: $name")
}


🔸 اینجا تابع «validateInput» فقط داخل «registerUser» معتبره و کد رو خواناتر و خشک‌تر (DRY) میکنه.

🔹 نکته مهم: توابع محلی میتونن به پارامترهای تابع بیرونی هم دسترسی داشته باشن (مثل «name» و «email»). این قابلیت باعث کاهش پارامترهای اضافی میشه.

🔸 از توابع محلی وقتی استفاده کن که منطق کمکی خیلی اختصاصیه و نباید در معرض بقیه کد قرار بگیره. مثلاً برای اعتبارسنجی، تبدیل داده یا پیش‌پردازش درون یه تابع پیچیده.

📌 خلاصه: توابع محلی ابزاری ساده برای ماژولار کردن کد بدون آلودگی scope هستن.

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🔹 دوست داری تو یه خط، کل لیست رو تغییر بدی یا فیلتر کنی؟
«map» و «filter» دو تا از قدرتمندترین عملیات‌های مجموعه در «Kotlin» هستن که کدت رو خواناتر و سریع‌تر می‌کنن 😎

🔸 «map» هر المان رو به چیز دیگه‌ای تبدیل می‌کنه. مثلاً لیست اعداد رو به مربع‌شون تبدیل کن.
🔸 «filter» فقط المان‌هایی رو نگه می‌داره که شرط مشخصی داشته باشن. مثلاً فقط اعداد زوج.

📌 کاربرد واقعی: فرض کن لیست قیمت‌های محصولات داری. می‌خوای قیمت‌های بالای ۱۰۰ رو با تخفیف ۲۰٪ نشون بدی.

🔹 اول کد رو ببین:

val prices = listOf(50, 150, 200, 80, 300)

val discounted = prices
.filter { it > 100 }
.map { it * 0.8 }

println(discounted) // [120.0, 160.0, 240.0]


🔸 توضیح: اول با «filter» قیمت‌های بزرگتر از ۱۰۰ رو جدا می‌کنیم، بعد با «map» هر کدوم رو در ۰.۸ ضرب می‌کنیم. نتیجه یه لیست جدید از تخفیف‌هاست.

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

برداشت عملی: هر وقت خواستی روی یه لیست تغییرات دسته‌جمعی بدی یا فیلترش کنی، از «map» و «filter» استفاده کن. با تمرین، دیگه از «for» بی‌نیاز می‌شی!

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
📦 در دنیای «Kotlin»، وقتی با لیست‌های تو در تو سروکار دارید، دو تا از قدرتمندترین ابزارها «flatMap» و «flatten» هستند.🧩 خیلی ساده بگم: «flatten» یک لیست از لیست‌ها رو به یک لیست تخت تبدیل می‌کنه و «flatMap» همون کار رو انجام میده ولی قبلش به هر عنصر یک نگاشت (مپ) اعمال میکنه.🤯 فرض کنید یک لیست از کاربران دارید که هر کاربر یک لیست از سفارشاتش رو داره. می‌خواید همه سفارشات رو یکجا ببینید. اول با «flatMap» می‌بینیم چطور کار میکنه.

کد عملی:

data class Order(val id: Int, val amount: Double)
data class User(val name: String, val orders: List<Order>)

val users = listOf(
User("Ali", listOf(Order(1, 100.0), Order(2, 200.0))),
User("Sara", listOf(Order(3, 150.0))),
User("Reza", listOf())
)

// استفاده از flatMap برای استخراج همه سفارشات
val allOrders: List<Order> = users.flatMap { it.orders }
println(allOrders) // [Order(1,100.0), Order(2,200.0), Order(3,150.0)]

// flatten فقط برای لیست‌های لیست بدون تغییر عناصر کار میکنه
val listOfLists = listOf(listOf(1,2), listOf(3,4), emptyList())
val flattened = listOfLists.flatten()
println(flattened) // [1, 2, 3, 4]


در این کد: «flatMap» به هر کاربر (عنصر) دسترسی پیدا میکنه، خاصیت «orders» رو برمی‌گردونه و سپس همه لیست‌ها رو در یک لیست تخت می‌ریزه. «flatten» هم برای حالتی که فقط لیست‌های لیست داریم و نمی‌خوایم تغییری در محتوا بدیم عالیه.💡 نکته کلیدی: «flatMap» معادل «map» + «flatten» هستش، ولی خیلی خواناتر و بهینه‌تر.

🔥 کاربرد واقعی: وقتی API‌ای دارید که داده‌های تو در تو برمی‌گردونه (مثلاً لیست گروه‌ها و هر گروه شامل لیست محصولات)، با «flatMap» می‌تونید سریع همه محصولات رو استخراج کنید و در «RecyclerView» نمایش بدید.🚀 این عملیات‌ها باعث میشن کدتون خواناتر، فشرده‌تر و دور از حلقه‌های تودرتو باشه. حتماً توی پروژه‌هاتون امتحان کنید.

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

━━━━━━━━━━━━━━━
@CodeitMobile
🥰1
لاندا اکسپرشن‌ها تو «Kotlin» مثل یک تابع بینام هستن که می‌تونی بدی به یه متد دیگه تا اجرا کنه. 😎 خیلی کدت رو خواناتر و کوتاه‌تر می‌کنه. بیا ببینیم چطور کار می‌کنه.

🔹 یه لاندا اکثراً با {} نوشته میشه و اگه فقط یه پارامتر داشته باشه می‌تونی از it استفاده کنی.

🔸 کاربرد واقعی: مثلاً فیلتر کردن یه لیست از اعداد. بدون لاندا باید یه حلقه می‌نوشتی، ولی با لاندا یه خط کافیه.

کد زیر رو ببین:
val numbers = listOf(1, 2, 3, 10, 15)
val filtered = numbers.filter { it > 5 }
println(filtered) // خروجی: [10, 15]

این کد با استفاده از تابع filter و یه لاندا اکسپرشن، اعداد بزرگ‌تر از ۵ رو برمی‌گردونه. «it» همون عنصر جاری لیسته.

💡 نکته: می‌تونی لاندا رو به عنوان آخرین پارامتر تابع بدی (Trailing Lambda Syntax) که خیلی رایج‌تره.

📌 حالا یه مثال کاربردی‌تر: فرض کن می‌خوای روی یه لیست از کاربران، اونایی که سنشون بالای ۱۸ هست رو پیدا کنی:
data class User(val name: String, val age: Int)
val users = listOf(User("Ali", 20), User("Sara", 17), User("Reza", 25))
val adults = users.filter { it.age >= 18 }
adults.forEach { println(it.name) } // خروجی: Ali, Reza


🧠 لانداها تو «Kotlin» برای callbackها، پردازش مجموعه‌ها و حتی تعریف شنونده‌ها توی «Android» عالی‌ان.

🎯 نتیجه: لاندا اکسپرشن‌ها یکی از قدرتمندترین ابزارهای «Kotlin» هستن. تمرین کن تا کدت حرفه‌ای‌تر بشه.

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1
🔥 توابع مرتبه‌بالا (Higher-order functions) تو «کاتلین» یه ابزار قدرتمند برای نوشتن کد تمیز و قابل استفاده مجدد هستن. یعنی تابعی که یا تابع دیگه‌ای رو به عنوان ورودی می‌گیره، یا یک تابع رو برمی‌گردونه. این کار کدت رو انعطاف‌پذیر می‌کنه.

📌 توی پروژه‌های واقعی مثلاً می‌خوای عملیات تکراری مثل نمایش پیام خطا یا ذخیره اطلاعات رو با رفتارهای مختلف یکپارچه کنی. به‌جای نوشتن چندین تابع جدا، می‌تونی یک تابع مرتبه‌بالا بنویسی که تابع مورد نظر رو بهش پاس بدی.

🧩 بیایم یه مثال ساده بزنیم:

fun performOperation(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}

fun main() {
val sum = performOperation(5, 3) { x, y -> x + y }
val product = performOperation(5, 3) { x, y -> x * y }
println("Sum: $sum, Product: $product")
}


📝 این کد یه تابع مرتبه‌بالا به اسم «performOperation» داره که دو عدد و یه تابع به اسم «operation» می‌گیره. بعد توی «main» دو بار با عملیات جمع و ضرب صدا زده شده. نتیجه: بدون تکرار کد، دو رفتار متفاوت داریم.

🎯 نکته مهم: ازش تو «Jetpack Compose» برای مدیریت رویدادها و ترکیب‌های شرطی استفاده می‌کنن. مثلاً تو «StateFlow» و «Callback»ها خیلی به کار میاد.

💡 نتیجه: یادگیری توابع مرتبه‌بالا کدتو خشک‌تر و خواناتر می‌کنه. حتماً تمرین کن.

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

━━━━━━━━━━━━━━━
@CodeitMobile
🔥1🥰1