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()
下面的程序具有一個(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á)式為:
請(qǐng)注意,花括號(hào)內(nèi)包含一個(gè)lambda表達(dá)式。
Koltin對(duì)函數(shù)式編程提供了強(qiáng)大的支持。您可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)。另外,您可以從其他函數(shù)返回一個(gè)函數(shù)。這些功能稱為高階函數(shù)。
為了方便起見,通常將lambda表達(dá)式傳遞給高階函數(shù)(而不是典型函數(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ù)返回產(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ì)象。
在上面的程序中,lambda表達(dá)式只接受一個(gè)參數(shù)(Person對(duì)象的列表)。在這種情況下,可以使用關(guān)鍵字 it 來引用參數(shù)。
您可以
val selectedPerson = people.maxBy({ person -> person.age })
等效于
val selectedPerson = people.maxBy({ it.age })
在上面的程序中。
下面的程序計(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