الفرق بين المراجعتين لصفحة: «Kotlin/idioms»
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:التعابير الاصطلاحيّة في لغة Kotlin}}</noinclude> تعرِض هذه الصفحة مجموعةً من التعابير ا...' |
مراجعة |
||
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:التعابير | <noinclude>{{DISPLAYTITLE:التعابير الاصطلاحية (Idioms) في لغة Kotlin}}</noinclude> | ||
تعرِض هذه الصفحة | تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة [[Kotlin]]، ولأيّ اصطلاحٍ جديدٍ لم يُذكَر فيمكنك [https://wiki.hsoub.com/index.php?title=Kotlin/idioms&veaction=edit تعديل هذه الصفحة] لإضافته. | ||
= إنشاء كائنات نقل البيانات DTO: Data Transfer Objects (الكائنات POJO/POCO) = | |||
ليكن الصنف (class) الآتي باسم <code>Customer</code>:<syntaxhighlight lang="kotlin"> | ليكن الصنف (class) الآتي باسم <code>Customer</code>:<syntaxhighlight lang="kotlin"> | ||
data class Customer(val name: String, val email: String) | data class Customer(val name: String, val email: String) | ||
</syntaxhighlight>وله التوابع | </syntaxhighlight>وله التوابع الوظيفيّة (functional methods) الآتية: | ||
* توابع getter (وتوابع setter في حالة المتحولات <code>var</code>) لكافة الخاصّيّات (properties) | * توابع getter (وتوابع setter في حالة المتحولات من النوع <code>var</code>) لكافة الخاصّيّات (properties) | ||
* <code>equals()</code> | * <code>equals()</code> | ||
* <code>hashCode()</code> | * <code>hashCode()</code> | ||
* <code>toString()</code> | * <code>toString()</code> | ||
* <code>copy()</code> | * <code>copy()</code> | ||
* <code>component1()</code> و <code>component2()</code> | * <code>component1()</code> و <code>component2()</code> ...إلخ. وذلك لكافة الخاصّيّات (properties) في الصنف (راجع [[Kotlin/data classes|أصناف البيانات [data classes]]]) | ||
== تحديد القيم | == تحديد القيم الافتراضية لمعاملات الدوال (Function Parameters) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun foo(a: Int = 0, b: String = "") { ... } | fun foo(a: Int = 0, b: String = "") { ... } | ||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/functions|الدوال (functions)]]. | ||
== ترشيح عناصر القائمة | == ترشيح (Filter) عناصر القائمة == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val positives = list.filter { x -> x > 0 } | val positives = list.filter { x -> x > 0 } | ||
سطر 24: | سطر 25: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== ملء | == ملء سلسلة نصية (String Interpolation) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
println("Name $name") | println("Name $name") | ||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/basic types|السلاسل النصيّة (strings)]]. | ||
== | == التحقق من القيمة باستخدام تعبير when == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
when (x) { | when (x) { | ||
is Foo -> ... | |||
is Bar -> ... | |||
else -> ... | |||
} | } | ||
== المرور بعناصر | |||
</syntaxhighlight>المزيد عن [[Kotlin/control flow|تعبير <code>when</code>.]] | |||
== المرور بعناصر كائن Map أو قائمة من الثنائيات (Pairs) == | |||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
for ((k, v) in map) { println("$k -> $v") } | for ((k, v) in map) { println("$k -> $v") } | ||
</syntaxhighlight>مهما كانت k أو v. | </syntaxhighlight>مهما كانت k أو v. | ||
== استخدام المجالات ( | == استخدام المجالات (Ranges) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
for (i in 1..100) { ... } // المجال مغلق ويتضمن 100 قيمة | for (i in 1..100) { ... } // المجال مغلق ويتضمن 100 قيمة | ||
for (i in 1 until 100) { ... } // مجال نصف مفتوح ولا يشمل 100 قيمة | for (i in 1 until 100) { ... } // مجال نصف مفتوح ولا يشمل 100 قيمة | ||
for (x in 2..10 step 2) { ... } // مجال بخطوة ثابتة 2 | for (x in 2..10 step 2) { ... } // مجال بخطوة ثابتة بمقدار 2 | ||
for (x in 10 downTo 1) { ... } // مجال تنازلي | for (x in 10 downTo 1) { ... } // مجال تنازلي | ||
if (x in 1..10) { ... }// قيمة المتحول | if (x in 1..10) { ... } // قيمة المتحول تقع ة في المجال من 1 حتى 10 | ||
</syntaxhighlight> | |||
</syntaxhighlight>المزيد عن [[Kotlin/ranges|المجالات (ranges)]]. | |||
== قائمة | == قائمة القراءة فقط (Read-Only List) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val list = listOf("a", "b", "c") | val list = listOf("a", "b", "c") | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == كائن Map للقراءة فقط == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val map = mapOf("a" to 1, "b" to 2, "c" to 3) | val map = mapOf("a" to 1, "b" to 2, "c" to 3) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== الوصول إلى | == الوصول إلى كائن Map == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
println(map["key"]) | println(map["key"]) | ||
map["key"] = value | map["key"] = value | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | == الخاصية الكسولة (Lazy Property) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val p: String by lazy { | val p: String by lazy { | ||
// عمليات على السلسلة النصيّة | |||
} | } | ||
</syntaxhighlight> | |||
</syntaxhighlight>المزيد عن [[Kotlin/delegated properties|الخاصيّات الكسولة (lazy properties)]]. | |||
== الدوال الإضافية (Extension Functions) == | == الدوال الإضافية (Extension Functions) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun String.spaceToCamelCase() { ... } | fun String.spaceToCamelCase() { ... } | ||
"Convert this to camelcase".spaceToCamelCase() | "Convert this to camelcase".spaceToCamelCase() | ||
== إنشاء نمط | |||
</syntaxhighlight>المزيد عن [[Kotlin/extensions|الدوال الإضافيّة (extension functions)]]. | |||
== إنشاء نمط التصميم Singleton == | |||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
object Resource { | object Resource { | ||
val name = "Name" | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 92: | سطر 103: | ||
val files = File("Test").listFiles() | val files = File("Test").listFiles() | ||
println(files?.size) | println(files?.size) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 98: | سطر 111: | ||
val files = File("Test").listFiles() | val files = File("Test").listFiles() | ||
println(files?.size ?: "empty") | println(files?.size ?: "empty") | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 104: | سطر 119: | ||
val values = ... | val values = ... | ||
val email = values["email"] ?: throw IllegalStateException("Email is missing!") | val email = values["email"] ?: throw IllegalStateException("Email is missing!") | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== الحصول على العنصر الأول من مجموعة قد تكون | == الحصول على العنصر الأول من مجموعة قد تكون فارغة == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val emails = ... // من الممكن أن تكون فارغة | val emails = ... // من الممكن أن تكون فارغة | ||
val mainEmail = emails.firstOrNull() ?: "" | val mainEmail = emails.firstOrNull() ?: "" | ||
</syntaxhighlight> | |||
</syntaxhighlight>المزيد عن [[Kotlin/collections|المجموعات (collections)]]. | |||
== تنفيذ if not null == | == تنفيذ if not null == | ||
سطر 116: | سطر 135: | ||
val value = ... | val value = ... | ||
value?.let { | value?.let { | ||
... // سينفذ هذا الجزء إن لم تكن القيمة null | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== تعيين | == تعيين Map للقيم من النوع nullable إن لم تكن بقيمة <code>null</code> == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val value = ... | val value = ... | ||
val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull | val mapped = value?.let { transformValue(it) } ?: defaultValueIfValueIsNull | ||
== أمر العودة (return) في | |||
</syntaxhighlight>المزيد عن [[Kotlin/null safety|استخدام القيمة null وأمانها]]. | |||
== أمر العودة (<code>return</code>) في تعبير <code>when</code> == | |||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun transform(color: String): Int { | fun transform(color: String): Int { | ||
return when (color) { | |||
"Red" -> 0 | |||
"Green" -> 1 | |||
"Blue" -> 2 | |||
else -> throw | |||
IllegalArgumentException("Invalid color param value") | IllegalArgumentException("Invalid color param value") | ||
} | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/returns|أمر العودة (<code>return</code>)]]. | ||
== تعبير <code>try/catch</code> == | == تعبير <code>try</code>/<code>catch</code> == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun test() { | fun test() { | ||
val result = try { | |||
count() | |||
} catch (e: ArithmeticException) { | |||
throw IllegalStateException(e) | |||
} | |||
// العمل بالنتائج | |||
} | |||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/exceptions|الاستثناءات (exceptions)]]. | ||
== تعبير <code>if</code> == | == تعبير <code>if</code> == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun foo(param: Int) { | fun foo(param: Int) { | ||
val result = if (param == 1) { | |||
"one" | |||
} else if (param == 2) { | |||
"two" | |||
} else { | |||
"three" | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/control flow|تعبير الشرط if]]. | ||
== استخدام الشكل البنائي للتوابع ( | == استخدام الشكل البنائي (Builder-Style) للتوابع (Methods) التي تعيد النوع <code>Unit</code> == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun arrayOfMinusOnes(size: Int): IntArray { | fun arrayOfMinusOnes(size: Int): IntArray { | ||
return IntArray(size).apply { fill(-1) } | |||
} | } | ||
سطر 182: | سطر 203: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== الدالة | == الدالة وحيدة التعبير (Single-Expression Functions) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
fun theAnswer() = 42 | fun theAnswer() = 42 | ||
</syntaxhighlight>وهذا مماثل تمامًا للشكل:<syntaxhighlight lang="kotlin"> | </syntaxhighlight>وهذا مماثل تمامًا للشكل:<syntaxhighlight lang="kotlin"> | ||
fun theAnswer(): Int { | fun theAnswer(): Int { | ||
return 42 | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>وقد تُدمَج مع تعابير اصطلاحيّة أخرى بهدف الحصول على شيفرة أقصر، مثل دمجها مع تعبير <code>when</code> بالشكل:<syntaxhighlight lang="kotlin"> | ||
fun transform(color: String): Int = when (color) { | fun transform(color: String): Int = when (color) { | ||
"Red" -> 0 | |||
"Green" -> 1 | |||
"Blue" -> 2 | |||
else -> throw | |||
IllegalArgumentException("Invalid color param value") | IllegalArgumentException("Invalid color param value") | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/functions|الدوال (functions)]]. | ||
== استدعاء عدة توابع ( | == استدعاء عدة توابع (Methods) عبر الكائن (Object) (باستخدام <code>with</code>) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
class Turtle { | class Turtle { | ||
fun penDown() | |||
fun penUp() | |||
fun turn(degrees: Double) | |||
fun forward(pixels: Double) | |||
} | } | ||
val myTurtle = Turtle() | val myTurtle = Turtle() | ||
with(myTurtle) { //لرسم مربع بمئة بكسل | with(myTurtle) { //لرسم مربع بمئة بكسل | ||
penDown() | |||
for(i in 1..4) { | |||
forward(100.0) | |||
turn(90.0) | |||
} | |||
penUp() | |||
} | } | ||
سطر 227: | سطر 245: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== تجربة Java 7 مع المصادر ( | == تجربة Java 7 مع المصادر (Resources) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val stream = Files.newInputStream(Paths.get("/some/file.txt")) | val stream = Files.newInputStream(Paths.get("/some/file.txt")) | ||
stream.buffered().reader().use { reader -> | stream.buffered().reader().use { reader -> | ||
println(reader.readText()) | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== الشكل | == الشكل المناسب للدالة العامة (Generic) والتي تتطلب معلومات من النوع العام (Generic) == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
// | // 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) | inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json, T::class.java) | ||
</syntaxhighlight> | </syntaxhighlight>المزيد عن [[Kotlin/generics|الأنواع المُعمَّمة (generics)]]. | ||
== استخدام القيم | == استخدام القيم المنطقية (Boolean) من النوع Nullable == | ||
<syntaxhighlight lang="kotlin"> | <syntaxhighlight lang="kotlin"> | ||
val b: Boolean? = ... | val b: Boolean? = ... | ||
if (b == true) { | if (b == true) { | ||
... | |||
} else { | } else { | ||
//false أو null قيمة المتحول إما | |||
} | } | ||
</syntaxhighlight> | |||
</syntaxhighlight>المزيد عن [[Kotlin/null safety|استخدام القيمة null وأمانها]]. | |||
== مصادر == | == مصادر == | ||
* [https://kotlinlang.org/docs/reference/idioms.html | * [https://kotlinlang.org/docs/reference/idioms.html التعابير الاصطلاحيّة في التوثيق الرسميّ للغة Kotlin.] | ||
[[تصنيف:Kotlin]] | [[تصنيف:Kotlin]] | ||
[[تصنيف:Kotlin conventions]] | [[تصنيف:Kotlin conventions]] |
المراجعة الحالية بتاريخ 09:22، 15 مايو 2018
تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة 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 وأمانها.