Safe call و Elvis
مقدار null را نزدیک محل مصرف به خروجی جایگزین تبدیل کنید.
fun displayName(user: User?): String = user?.name?.takeIf { it.isNotBlank() } ?: "Guest"
راهنمای Kotlin برای نوعها، null safety، کلاس داده، مجموعهها و coroutineها. نوع nullable را با ? بیان کنید و با safe call، Elvis و smart cast مسیرهای null را کنترل کنید. data class برای دادهٔ مقداری مناسب است. توابع collection خروجی تازه تولید میکنند؛ برای پردازش تنبل از Sequence و extensionهای کوچک و نامگذاریشده استفاده کنید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
مقدار null را نزدیک محل مصرف به خروجی جایگزین تبدیل کنید.
fun displayName(user: User?): String = user?.name?.takeIf { it.isNotBlank() } ?: "Guest"data class برابری مقداری، copy و destructuring میدهد.
data class Product( val id: Long, val name: String, val price: Double)sealed hierarchy امکان مدلسازی حالتها و when exhaustive را میدهد.
sealed interface Result<out T>data class Success<T>(val value: T) : Result<T>data class Failure(val message: String) : Result<Nothing>fun label(result: Result<*>): String = when (result) { is Success<*> -> "success" is Failure -> result.message}زنجیرهٔ کوتاه انتخاب و تبدیل را بیان میکند.
val names = users .filter { it.isActive } .map { it.name } .sorted()groupBy یک map از کلید به فهرست عضوها میسازد.
val usersByCity: Map<String, List<User>> = users.groupBy { it.city }Sequence میتواند تخصیص مجموعههای میانی را در زنجیرههای بزرگ کاهش دهد.
val firstLongNames = users.asSequence() .map { it.name } .filter { it.length > 10 } .take(5) .toList()suspend امکان توقف غیرمسدودکنندهٔ coroutine را میدهد.
suspend fun loadUser(id: Long): User { return api.fetchUser(id)}async را در coroutine scope اجرا و نتیجه را با await دریافت کنید.
suspend fun loadDashboard(): Dashboard = coroutineScope { val profile = async { api.profile() } val alerts = async { api.alerts() } Dashboard(profile.await(), alerts.await())}در finally cleanup کنید و CancellationException را بیصدا نبلعید.
suspend fun observe() { try { repository.events().collect(::handleEvent) } finally { releaseResources() }}مقدار ثابت را با val و متغیر را با var تعریف کنید.
نوع nullable را با ? مشخص کنید و از ?. یا ?: آگاهانه بهره ببرید.
برای مقداردهی امن از let یا guard روشن استفاده کنید؛ !! را محدود کنید.
داده ساده را با data class مدل کنید.
از when برای شاخهبندی و پوشش حالتهای محدود استفاده کنید.
توابع extension را برای رفتارهای مرتبط و قابلکشف تعریف کنید.
از List فقطخواندنی و MutableList در جای مناسب استفاده کنید.
عملیات ناهمگام را با coroutine و scope دارای چرخه عمر روشن اجرا کنید.
خطا را در مرز API مدیریت و context لغو را حفظ کنید.
کد را با formatter و تستهای مربوط به null، حالتهای مرزی و coroutine بررسی کنید.
برای حالتهای نتیجهٔ محدود از sealed type استفاده کنید تا when بتواند کاملبودن شاخهها را بررسی کند.
coroutine را در scope دارای lifecycle اجرا کنید و cancellation را نبلعید؛ آن را به فراخواننده منتقل کنید.