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

من موسوعة حسوب
مراجعة 09:22، 15 مايو 2018 بواسطة Nourtam (نقاش | مساهمات) (مراجعة)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة 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 وأمانها.

مصادر