Kotlin Lambda 表達(dá)式

Lambda表達(dá)式

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

fun main(args: Array<String>) {

    val greeting = { println("Hello!")}

    //調(diào)用函數(shù)
    greeting()
}

運(yùn)行該程序時(shí),輸出為:

Hello!

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

然后,按如下方式調(diào)用函數(shù)(lambda表達(dá)式):

greeting()

示例:帶參數(shù)和返回類型的Lambda

下面的程序具有一個(gè)lambda表達(dá)式,該表達(dá)式接受兩個(gè)整數(shù)作為參數(shù),并返回這兩個(gè)整數(shù)的乘積。

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

運(yùn)行該程序時(shí),輸出為:

27

在這里,lambda表達(dá)式為:

Kotlin Lambda表達(dá)式語法

請(qǐng)注意,花括號(hào)內(nèi)包含一個(gè)lambda表達(dá)式。

高階函數(shù)

Koltin對(duì)函數(shù)式編程提供了強(qiáng)大的支持。您可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)。另外,您可以從其他函數(shù)返回一個(gè)函數(shù)。這些功能稱為高階函數(shù)。

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

示例:將Lambda傳遞給函數(shù)

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

fun callMe(greeting: () -> Unit) {
    greeting()
}

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

運(yùn)行該程序時(shí),輸出為:

Hello!

在這里,callMe()是一個(gè)高階函數(shù)(因?yàn)樗鼘⒑瘮?shù)作為參數(shù))。 greeting參數(shù)接受傳遞給callMe()函數(shù)的 Lambda:

 greeting: () -> Unit

空括號(hào)表明,傳遞的匿名函數(shù)不接受任何參數(shù)。 而且,Unit關(guān)鍵字表明匿名函數(shù)不返回任何值。

Lambda 在處理集合時(shí)經(jīng)常使用。 而且,標(biāo)準(zhǔn)庫中有幾個(gè)內(nèi)置函數(shù)可以使用 lambda 來簡化我們的任務(wù)方式。 您將在此處看到幾個(gè)示例:

示例:maxBy()函數(shù)

maxBy()函數(shù)返回產(chǎn)生給定函數(shù)最大值的第一個(gè)元素;如果沒有元素,則返回null。

data class Person(val name: String, val age: Int)

fun main(args: Array<String>) {

    val people = listOf(
            Person("Jack", 34),
            Person("Shelly", 19),
            Person("Patrick", 13),
            Person("Jill", 12),
            Person("Shane", 22),
            Person("Joe", 18)
            )

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

    println(selectedPerson)
    println("name: ${selectedPerson?.name}" )
    println("age: ${selectedPerson?.age}" )
}

運(yùn)行該程序時(shí),輸出為:

Person(name=Jack, age=34)
name: Jack
age: 34

這里,maxBy()函數(shù)獲取Person對(duì)象列表,并返回具有最大年齡的Person對(duì)象。

it 關(guān)鍵字:用于單參數(shù)

在上面的程序中,lambda表達(dá)式只接受一個(gè)參數(shù)(Person對(duì)象的列表)。在這種情況下,可以使用關(guān)鍵字 it 來引用參數(shù)。

您可以

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

等效于

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

在上面的程序中。

示例:maxBy() 和 startsWith()函數(shù)

下面的程序計(jì)算以字母 S 開頭的 Person對(duì)象 的最大年齡。

我們將使用兩個(gè)庫函數(shù) maxBy() 和 startsWith() 完成此任務(wù)。如果StarsWith()函數(shù)是以作為參數(shù)傳遞的指定字符開頭,則返回true。

data class Person(val name: String, val age: Int)

fun main(args: Array<String>) {

    val people = listOf(
            Person("Jack", 34),
            Person("Shelly", 19),
            Person("Patrick", 13),
            Person("Jill", 12),
            Person("Shane", 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}" )
}

運(yùn)行該程序時(shí),輸出為:

Person(name=Shane, age=22)
name: Shane
age: 22
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清