مثالهایی از شیوه برنامهنویسی کاتلین
در این مطلب که ترجمهای است از مستندات رسمی کاتلین، با چند مثال متنوع، با شیوه برنامهنویسی کاتلین آشنا میشوید.
ساخت اشیای انتقال داده یا DTO
data class Customer(val name: String, val email: String)
مثال بالا کلاسی به نام Customer میسازد که این امکانات را دارد: equals() و hashCode() و toString() و copy() و …
مقدار پیشفرض برای پارامترهای تابع
fun foo(a: Int = 0, b: String = "") { ... }
فیلتر کردن یک لیست
val positives = list.filter { x -> x > 0 }
یا استفاده از این روش حتا کوتاهتر:
val positives = list.filter { it > 0 }
پارامتری کردن رشتهها
println("Name $name")
چک کردن نوع متغیرها
when (x) { is Foo -> ... is Bar -> ... else -> ... }
پیمایش یک لیست یا نگاشت (map)
for ((k, v) in map) { println("$k -> $v") }
میتوانید به جای k و v از هر اسمی استفاده کنید. k کلید و v مقدار است.
for (i in 1..100) { ... } // closed range: includes 100 for (i in 1 until 100) { ... } // half-open range: does not include 100 for (x in 2..10 step 2) { ... } for (x in 10 downTo 1) { ... } if (x in 1..10) { ... }
استفاده از بازهها
val list = listOf("a", "b", "c")
لیست فقط خواندنی
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
دسترسی به اعضای یک نگاشت (map)
println(map["key"]) map["key"] = value
ویژگی lazy
در کاتلین میتوانیم مقداردهی به یک متغیر را به صورت lazy یا تنبل معرفی کنیم. در این صورت مقداردهی این متغیر تا زمانی که از آن استفاده نکردهایم به تعویق میافتد:
val p: String by lazy { // compute the string }
توابع توسعهای
در کاتلین میتوانید به کلاسهای موجود مثل کلاس String توابع دیگری اضافه کنید و مثل توابع کلاس آنها را با عملگر «.» صدا بزنید:
fun String.spaceToCamelCase() { ... } "Convert this to camelcase".spaceToCamelCase()
ساخت متغیر یکتا (singleton)
متغیرهای یکتا متغیرهایی هستند که فقط یک بار مقداردهی میشوند و پس از آن همه جا از همان یک نمونه مقداردهی شده استفاده میشود:
object Resource { val name = "Name" }
میانبر if not null
در مثال زیر اگر متغیر files نول نباشد دستور اجرا میشود و اگر نول باشد دستور اجرا نمیشود:
val files = File("Test").listFiles() println(files?.size)
میانبر if not null و else
در مثال زیر اگر files نول نباشد، اندازه آن و اگر نول باشد عبارت empty چاپ میشود:
val files = File("Test").listFiles() println(files?.size ?: "empty")
اجرای یک عبارت در صورت null بودن با استفاده از ?:
val values = ... val email = values["email"] ?: throw IllegalStateException("Email is missing!")
اجرای یک عبارت در صورت null نبودن با استفاده از let
در مثال زیر اگر value نول نباشد دستورات داخل آکولاد اجرا میشود:
val value = ... value?.let { ... // execute this block if not null }
نگاشت مقادیر نول شدنی و چک کردن نول بودن آنها با 😕
در مثال زیر میخواهیم یک تابع را بر روی همه مقادیر یک لیست اجرا کنیم و اگر مقدار null بود یک مقدار پیشفرض را در لیست نهایی قرار دهیم:
val value = ... val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull
برگرداندن مقدار از یک تابع با استفاده از when
fun transform(color: String): Int { return when (color) { "Red" -> 0 "Green" -> 1 "Blue" -> 2 else -> throw IllegalArgumentException("Invalid color param value") } }
عبارت try/catch
fun test() { val result = try { count() } catch (e: ArithmeticException) { throw IllegalStateException(e) } // Working with result }
عبارت if
fun foo(param: Int) { val result = if (param == 1) { "one" } else if (param == 2) { "two" } else { "three" } }
استفاده از توابع به شیوه الگوی Builder
در مثال زیر هر گاه که تابع arrayOfMinusOnes را صدا بزنیم یک آرایه به طولی که مشخص کردهایم به ما میدهد که همه عناصر آن با ۱- مقداردهی شدهاند:
fun arrayOfMinusOnes(size: Int): IntArray { return IntArray(size).apply { fill(-1) } }
توابعی که فقط یک عبارت دارند (توابع تک خطی)
fun theAnswer() = 42
مثال بالا شکل ساده شده کد زیر است:
fun theAnswer(): Int { return 42 }
این امکان میتواند با سایر امکانات کاتلین ترکیب شود تا کدهای کوتاهتری نوشته شود. برای مثال ترکیب تابع یک عبارتی با when:
fun transform(color: String): Int = when (color) { "Red" -> 0 "Green" -> 1 "Blue" -> 2 else -> throw IllegalArgumentException("Invalid color param value") }
فراخوانی چند تابع بر روی یک شی با استفاده از with
در مثال زیر عبارتهایی که داخل آکولاد with قرار دارند همگی بر روی شی myTurtle اجرا میشوند و نیازی نیست همه آنها را myTurtle.penDown و مانند آن اجرا کنیم:
class Turtle { fun penDown() fun penUp() fun turn(degrees: Double) fun forward(pixels: Double) } val myTurtle = Turtle() with(myTurtle) { //draw a 100 pix square penDown() for(i in 1..4) { forward(100.0) turn(90.0) } penUp() }
استفاده از try برای استفاده از منابع (سبک جاوا ۷)
val stream = Files.newInputStream(Paths.get("/some/file.txt")) stream.buffered().reader().use { reader -> println(reader.readText()) }
مصرف کردن یک متغیر Boolean نول شدنی
val b: Boolean? = ... if (b == true) { ... } else { // `b` is false or null }
آیا برای استفاده از زبان برنامهنویسی کاتلین در پروژه بعدیتان متقاعد شدهاید؟ نظرتان را با ما در میان بگذارید!
سرعت لود سایت فوق العاده کمه
فوق العاده بود خدا قوت