التعابير الاصطلاحية (Idioms) في لغة Kotlin

من موسوعة حسوب

تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة Kotlin، ولأيّ اصطلاحٍ جديدٍ لم يُذكَر فيمكنك تعديل هذه الصفحة لإضافته.

إنشاء كائنات نقل البيانات DTO:‏ Data Transfer Objects (الكائنات POJO/POCO)

ليكن الصنف (class) الآتي باسم Customer:

data class Customer(val name: String, val email: String)

وله التوابع الوظيفيّة (functional methods) الآتية:

  • توابع getter (وتوابع setter في حالة المتحولات من النوع var) لكافة الخاصّيّات (properties)
  • equals()‎
  • hashCode()‎
  • toString()‎
  • copy()‎
  • component1()‎ و component2()‎ ...إلخ. وذلك لكافة الخاصّيّات (properties) في الصنف (راجع أصناف البيانات [data classes])

تحديد القيم الافتراضية لمعاملات الدوال (Function Parameters)

fun foo(a: Int = 0, b: String = "") { ... }

المزيد عن الدوال (functions).

ترشيح (Filter) عناصر القائمة

val positives = list.filter { x -> x > 0 }

أو بشكلٍ أكثر اختصارًا:

val positives = list.filter { it > 0 }

ملء سلسلة نصية (String Interpolation)

println("Name $name")

المزيد عن السلاسل النصيّة (strings).

التحقق من القيمة باستخدام تعبير when

when (x) {
   is Foo -> ...
   is Bar -> ...
   else   -> ...
}

المزيد عن تعبير when.

المرور بعناصر كائن Map أو قائمة من الثنائيات (Pairs)

for ((k, v) in map) { println("$k -> $v") }

مهما كانت k أو v.

استخدام المجالات (Ranges)

for (i in 1..100)       { ... } // المجال مغلق ويتضمن 100 قيمة
for (i in 1 until 100)  { ... } // مجال نصف مفتوح ولا يشمل 100 قيمة
for (x in 2..10 step 2) { ... } // مجال بخطوة ثابتة بمقدار 2
for (x in 10 downTo 1)  { ... } // مجال تنازلي
if  (x in 1..10)        { ... } // قيمة المتحول تقع ة في المجال من 1 حتى 10

المزيد عن المجالات (ranges).

قائمة القراءة فقط (Read-Only List)

val list = listOf("a", "b", "c")

كائن Map للقراءة فقط

val map = mapOf("a" to 1, "b" to 2, "c" to 3)

الوصول إلى كائن Map

println(map["key"])
map["key"] = value

الخاصية الكسولة (Lazy Property)

val p: String by lazy {
   // عمليات على السلسلة النصيّة
}

المزيد عن الخاصيّات الكسولة (lazy properties).

الدوال الإضافية (Extension Functions)

fun String.spaceToCamelCase() { ... }
"Convert this to camelcase".spaceToCamelCase()

المزيد عن الدوال الإضافيّة (extension functions).

إنشاء نمط التصميم Singleton

object Resource {
   val name = "Name"
}

شيفرة if not null المختصرة

val files = File("Test").listFiles()
println(files?.size)

شيفرة if not و else المختصرة

val files = File("Test").listFiles()
println(files?.size ?: "empty")

تنفيذ التعليمة if null

val values = ...
val email = values["email"] ?: throw IllegalStateException("Email is missing!")

الحصول على العنصر الأول من مجموعة قد تكون فارغة

val emails = ... // من الممكن أن تكون فارغة
val mainEmail = emails.firstOrNull() ?: ""

المزيد عن المجموعات (collections).

تنفيذ if not null

val value = ...
value?.let {
   ... // سينفذ هذا الجزء إن لم تكن القيمة null
}

تعيين Map للقيم من النوع nullable إن لم تكن بقيمة null

val value = ...

val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull

المزيد عن استخدام القيمة null وأمانها.

أمر العودة (return) في تعبير when

fun transform(color: String): Int {
   return when (color) {
       "Red" -> 0
       "Green" -> 1
       "Blue" -> 2
       else -> throw
IllegalArgumentException("Invalid color param value")
   }
}

المزيد عن أمر العودة (return).

تعبير try/catch

fun test() {
   val result = try {
       count()
   } catch (e: ArithmeticException) {
       throw IllegalStateException(e)
   }
   // العمل بالنتائج
}

المزيد عن الاستثناءات (exceptions).

تعبير if

fun foo(param: Int) {
   val result = if (param == 1) {
       "one"
   } else if (param == 2) {
       "two"
   } else {
       "three"
   }
}

المزيد عن تعبير الشرط if.

استخدام الشكل البنائي (Builder-Style) للتوابع (Methods) التي تعيد النوع Unit

fun arrayOfMinusOnes(size: Int): IntArray {
   return IntArray(size).apply { fill(-1) }
}

الدالة وحيدة التعبير (Single-Expression Functions)

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")
}

المزيد عن الدوال (functions).

استدعاء عدة توابع (Methods) عبر الكائن (Object) (باستخدام with)

class Turtle {
   fun penDown()
   fun penUp()
   fun turn(degrees: Double)
   fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { //لرسم مربع بمئة بكسل
   penDown()
   for(i in 1..4) {
       forward(100.0)
       turn(90.0)
   }
   penUp()
}

تجربة Java 7 مع المصادر (Resources)

val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
   println(reader.readText())
}

الشكل المناسب للدالة العامة (Generic) والتي تتطلب معلومات من النوع العام (Generic)

//  public final class Gson {
//     ...
//     public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
//     ...

inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java)

المزيد عن الأنواع المُعمَّمة (generics).

استخدام القيم المنطقية (Boolean) من النوع Nullable

val b: Boolean? = ...
if (b == true) {
   ...
} else {
   //false أو null قيمة المتحول إما 
}

المزيد عن استخدام القيمة null وأمانها.

مصادر