English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin 基礎教程

Kotlin 流程控制

الوظائف في Kotlin

ال

Kotlin 面向對象(OOP)

Kotlin Lambda 表達式

Lambda表達式

Lambda表達式或簡稱lambda是一個匿名函數;沒有名稱的函數。這些函數立即作為表達式傳遞而無需聲明。例如,

fun main(args: Array<String>) {
    val greeting = { println(\"Hello!\") }
    //調用函數
    greeting()
}

عند تشغيل هذا البرنامج، الناتج سيكون:

مرحبًا!

在此,將lambda表達式分配給變量greeting。該表達式在該程序中不接受任何參數,也不返回任何值。

然後,按如下方式調用函數(lambda表達式):

greeting()

示例:帶參數和返回類型的Lambda

下面的程序具有一個lambda表達式,該表達式接受兩個整數作為參數,並返回這兩個整數的乘積。

fun main(args: Array<String>) {
    val product = { a: Int, b: Int -> a * b }
    val result = product(9, 3)
    println(result)
}

عند تشغيل هذا البرنامج، الناتج سيكون:

27

在這裡,lambda表達式為:

請注意,花括號內包含一個lambda表達式。

高階函數

Koltin對函數式編程提供了強大的支持。您可以将函数作为参数传递给其他函数。另外,您可以从其他函数返回一个函数。这些功能称为高階函數。

為了方便起見,通常將lambda表達式傳遞給高階函數(而不是典型函數)。

示例:將Lambda傳遞給函數

讓我們將lambda表達式傳遞給高階函數。這是您的操作方法。

fun callMe(greeting: () -> Unit) {
    greeting()
}
fun main(args: Array<String>) {
    callMe({ println(\"Hello!\") })
}

عند تشغيل هذا البرنامج، الناتج سيكون:

مرحبًا!

في هذا، callMe() هو وظيفة مرتفعة المستوى (بما أنها تأخذ وظيفة كمعامل). يقبل معامل greeting وظيفة lambda التي يتم تقديمها إلى وظيفة callMe():

 greeting: () -> Unit

الضوابط الفارغة تشير إلى أن الوظيفة المجهولة لا تأخذ أي معاملات. وكلمة المفتاح Unit تشير إلى أن الوظيفة المجهولة لا تعود أي قيمة.

تستخدم lambda بشكل متكرر في معالجة المجموعات. ولديها عدة واجهات مدمجة في مكتبة المعايير يمكن استخدامها لتسهيل طريقة تنفيذ مهامنا. سنرى بعض الأمثلة هنا:

مثال: واجهة maxBy()

تعيد واجهة maxBy() العنصر الأول الذي يولد أكبر قيمة للوظيفة المقدمة؛ إذا لم يكن هناك أي عنصر، تعود null.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    val people = listOf(
            Person(جاك، 34),
            Person(شيلي، 19),
            Person(باتريك، 13),
            Person(جيل، 12),
            Person(شاين، 22),
            Person("Joe", 18)
            )
    val selectedPerson = people.maxBy({ person ->  person.age })
    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

عند تشغيل هذا البرنامج، الناتج سيكون:

Person(name=جاك، 34)
name: جاك
age: 34

في هذا، تؤخذ واجهة maxBy() قائمة Person وتعود Person الذي يحتوي على أقدم العمر.

كلمة المفتاح it: لمعامل واحد

في البرنامج أعلاه، تعبير lambda يقبل فقط معامل واحد (قائمة Person). في هذه الحالة، يمكنك استخدام كلمة المفتاح it للإشارة إلى المعامل.

يمكنك

val selectedPerson = people.maxBy({ person -> person.age })

يساوي

val selectedPerson = people.maxBy({ it.age })

في البرنامج أعلاه.

مثال: واجهات maxBy() و startsWith()

مثال: حساب أقدم Person المبدأ بالحرف S

سنستخدم دwoch واجهة معيارية maxBy() و startsWith() لإنجاز هذه المهمة. إذا كانت واجهة startsWith() تبدأ بتحديد الحرف كمعامل، فإنها تعود true.

data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
    val people = listOf(
            Person(جاك، 34),
            Person(شيلي، 19),
            Person(باتريك، 13),
            Person(جيل، 12),
            Person(شاين، 22),
            Person("Joe", 18)
            )
    val selectedPerson = people
            .filter { it.name.startsWith("S") }
            .maxBy{ it.age }
    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

عند تشغيل هذا البرنامج، الناتج سيكون:

Person(name=Shane, age=22)
الاسم: Shane
العمر: 22