التعابير الاصطلاحية (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 وأمانها.

مصادر