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