الفرق بين المراجعتين لصفحة: «Kotlin/idioms»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:التعابير الاصطلاحيّة في لغة Kotlin}}</noinclude> تعرِض هذه الصفحة مجموعةً من التعابير ا...'
 
مراجعة
 
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:التعابير الاصطلاحيّة في لغة Kotlin}}</noinclude>
<noinclude>{{DISPLAYTITLE:التعابير الاصطلاحية (Idioms) في لغة Kotlin}}</noinclude>
تعرِض هذه الصفحة مجموعةً من التعابير الاصطلاحيّة المتعدِّدة والمستخدَمة بكثرةٍ في لغة Kotlin، وإن وُجد اصطلاحٌ غير مذكورٍ يمكنك إعلامنا لإضافته.
تعرِض هذه الصفحة عددًا من التعابير الاصطلاحيّة المستخدَمة بكثرةٍ في لغة [[Kotlin]]، ولأيّ اصطلاحٍ جديدٍ لم يُذكَر فيمكنك [https://wiki.hsoub.com/index.php?title=Kotlin/idioms&veaction=edit تعديل هذه الصفحة] لإضافته.
== إنشاء كائنات نقل البيانات DTO (كائنات POJO/POCO) ==
 
= إنشاء كائنات نقل البيانات 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>‎ و... إلخ. وذلك لكافة الخاصّيّات (properties) (راجع [[Kotlin/data classes|أصناف البيانات data classes]])
* <code>component1()</code>‎ و <code>component2()</code>‎ ...إلخ. وذلك لكافة الخاصّيّات (properties) في الصنف (راجع [[Kotlin/data classes|أصناف البيانات [data classes]]])


== تحديد القيم الافتراضيّة لمتحوِّلات الدوال (function parameters) ==
== تحديد القيم الافتراضية لمعاملات الدوال (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) ==
== ترشيح (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) ==
== ملء سلسلة نصية (String Interpolation) ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
println("Name $name")
println("Name $name")
</syntaxhighlight>
</syntaxhighlight>المزيد عن [[Kotlin/basic types|السلاسل النصيّة (strings)]].


== التحقُّق من القيمة باستخدام when ==
== التحقق من القيمة باستخدام تعبير when ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
when (x) {
when (x) {
    is Foo -> ...
   is Foo -> ...
    is Bar -> ...
   is Bar -> ...
    else  -> ...
   else   -> ...
}
}
</syntaxhighlight>


== المرور بعناصر map أو قائمة من الثنائيات (pairs) ==
 
</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) ==
== استخدام المجالات (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) { ... }// قيمة المتحول هي إحدى القيم الواقعة في المجال من 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 للقراءة فقط ==
== كائن 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 ==
== الوصول إلى كائن Map ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
println(map["key"])  
println(map["key"])
map["key"] = value
map["key"] = value
</syntaxhighlight>
</syntaxhighlight>


== الخاصّيّة الكسولة (Lazy property) ==
== الخاصية الكسولة (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>


== إنشاء نمط singleton (المشترك) ==
 
</syntaxhighlight>المزيد عن [[Kotlin/extensions|الدوال الإضافيّة (extension functions)]].
 
== إنشاء نمط التصميم Singleton ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
object Resource {
object Resource {
    val name = "Name"
   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
   ... // سينفذ هذا الجزء إن لم تكن القيمة null
}
}
</syntaxhighlight>
</syntaxhighlight>


== تعيين map للقيم nullable إن لم تكن قيمتها null ==
== تعيين 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
</syntaxhighlight>


== أمر العودة (return) في تعليمة <code>when</code> ==
 
</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) {
    return when (color) {
       "Red" -> 0
        "Red" -> 0
       "Green" -> 1
        "Green" -> 1
       "Blue" -> 2
        "Blue" -> 2
       else -> throw
        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)
   }
   // العمل بالنتائج
}


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


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


</syntaxhighlight>
</syntaxhighlight>المزيد عن [[Kotlin/control flow|تعبير الشرط if]].


== استخدام الشكل البنائي للتوابع (methods) التي تعيد النوع Unit ==
== استخدام الشكل البنائي (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) }
   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
   return 42
}
}




</syntaxhighlight>ويمكن أن تُدمَج مع تعابير اصطلاحية أخرى مما ينتج شيفرة أقصر مثل دمجها مع تعبير <code>when</code>:<syntaxhighlight lang="kotlin">
</syntaxhighlight>وقد تُدمَج مع تعابير اصطلاحيّة أخرى بهدف الحصول على شيفرة أقصر، مثل دمجها مع تعبير <code>when</code> بالشكل:<syntaxhighlight lang="kotlin">
fun transform(color: String): Int = when (color) {
fun transform(color: String): Int = when (color) {
    "Red" -> 0
   "Red" -> 0
    "Green" -> 1
   "Green" -> 1
    "Blue" -> 2
   "Blue" -> 2
    else -> throw  
   else -> throw
IllegalArgumentException("Invalid color param value")
IllegalArgumentException("Invalid color param value")
}
}




</syntaxhighlight>
</syntaxhighlight>المزيد عن [[Kotlin/functions|الدوال (functions)]].


== استدعاء عدة توابع (methods) عبر الكائن (object) (باستخدام <code>with</code>) ==
== استدعاء عدة توابع (Methods) عبر الكائن (Object) (باستخدام <code>with</code>) ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
class Turtle {
class Turtle {
 
   fun penDown()
    fun penDown()
   fun penUp()
    fun penUp()
   fun turn(degrees: Double)
    fun turn(degrees: Double)
   fun forward(pixels: Double)
    fun forward(pixels: Double)
}
}
val myTurtle = Turtle()
val myTurtle = Turtle()
with(myTurtle) { //لرسم مربع بمئة بكسل
with(myTurtle) { //لرسم مربع بمئة بكسل
    penDown()
   penDown()
    for(i in 1..4) {
   for(i in 1..4) {
        forward(100.0)
       forward(100.0)
        turn(90.0)
       turn(90.0)
    }
   }
    penUp()
   penUp()
}
}


سطر 227: سطر 245:
</syntaxhighlight>
</syntaxhighlight>


== تجربة Java 7 مع المصادر (resources) ==
== تجربة 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())
   println(reader.readText())
}
}
</syntaxhighlight>
</syntaxhighlight>


== الشكل الملائم للدالة العامّة (generic) والتي تتطلَّب معلومات من نوع عامّ (generic) ==
== الشكل المناسب للدالة العامة (Generic) والتي تتطلب معلومات من النوع العام (Generic) ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
//  public final class Gson {
//  public final class Gson {
//     ...
//     ...
//     public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
//     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) ==
== استخدام القيم المنطقية (Boolean) من النوع Nullable ==
<syntaxhighlight lang="kotlin">
<syntaxhighlight lang="kotlin">
val b: Boolean? = ...
val b: Boolean? = ...
if (b == true) {
if (b == true) {
    ...
   ...
} else {
} else {
    //false أو null قيمة المتحول إما  
   //false أو null قيمة المتحول إما  
}
}
</syntaxhighlight>
 
 
</syntaxhighlight>المزيد عن [[Kotlin/null safety|استخدام القيمة null وأمانها]].


== مصادر ==
== مصادر ==
* [https://kotlinlang.org/docs/reference/idioms.html صفحة التعابير الاصطلاحية في التوثيق الرسمي للغة Kotlin]
* [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 وأمانها.

مصادر