Kotlin中的Lambda表示式
Lambda就是匿名函式,什麼是匿名函式?匿名函式就是沒有名字的函式,大多數情況下我們定義的函式都是具名函式(有名字的函式).
具名函式如下
fun sum(arg1 : Int,arg2 : Int): Int{ return arg1 + arg2 }
這個函式的名字就叫sum.
那匿名函式怎麼定義呢, 下面就是一個匿名函式
fun(arg1 : Int, arg2 : Int) : Int{ return arg1 + arg2 }
這樣寫還不行,因為壓根不知道什麼時候用,所以我們需要付給一個引用,用來儲存它,然後在需要使用的時候呼叫
val sum = fun(arg1 : Int, arg2 : Int) : Int{ return arg1 + arg2 }
當然既然是匿名函式,我們也可以當作引數使用, 先定義一個傳入匿名函式引數的函式
fun test(action : (Int,Int) -> Int) : Int{ return action(1,2) }
這裡我說明一下這個引數的定義 action : (Int,Int) -> Int,它的意思是說傳入一個Lambda表示式,這個Lambda表示式是傳入兩個int,返回一個int, 在這個函式中呼叫action(1,2)的意思是執行這個Lambda表示式,傳入的引數是1和2
然後傳入匿名函式引數
val result = test({arg1 : Int, arg2 : Int -> arg1 + arg2}) println("result $result")
這樣傳入做的運算是1+2相加後並返回3並輸出.
當然也可以這樣寫,更加簡潔
val result = test({arg1, arg2 ->arg1 + arg2})
下面我們再來看個例子
fun main(args: Array<String>) { args.forEach { println(it) } }
forEach這個函式很奇怪,它沒有"()"去傳入引數,我們來看看它是怎麼實現的
public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }
其實forEach它是有引數的,這個引數就是一個型別為“action: (T) -> Unit”的函式 , 也就是傳入一個T型別的引數返回一個Unit型別(Unit是無返回型別)
for (element in this) action(element)
這就是一個迴圈執行Lambda表示式,按照這個函式定義我們原本呼叫應該是這樣
args.forEach({it : String -> println(it)})
簡潔一下
args.forEach({it -> println(it)})
kotlin中函式最後一個引數是Lambda表示式可以提取到"()"外面,於是變成了這樣
args.forEach(){it -> println(it)}
這裡我們來說下it這個關鍵字,當一個 lambda 表示式只有一個引數的時候,你可以在你的程式碼中將其省略,並用 it 代替 ,這是一個很有用的特性
於是乎就變成了這樣
args.forEach { println(it) }
這還不是終極版本,最終最簡潔的寫法是
args.forEach(::println)
前文中提到forEach就收的是一個action: (T) -> Unit型別的函式,而println的定義是
public inline fun println(message: Any?) { System.out.println(message) }
這就是傳入一個Any物件沒有返回值,T一定繼承自Any,println函式符合forEach引數的要求,所以我們直接用::println表示一個println引用傳入給forEach.
成員引用
成員引用的表達方式可以讓lambda的表達更加簡潔. 如果我們定義一個下面的類和一個傳遞action: (Person) -> Unit引數的擴充套件函式
fun Person.test(action: (Person) -> Unit){ action(this) } class Person(val name : String){ fun work(){ println("my name is $name i am working") } }
那麼通常呼叫這個擴充套件函式的方式是
val p = Person("小白") p.test({p:Person -> p.work()})
通過成員引用的表達方式可以這樣去表示
val p = Person("小白") p.test(Person::work)
Person::work其實是對lambda表示式{p:Person -> p.work()}的簡化
以上是我對kotlin中的Lambda表示式一點總結.
自己是從事了七年開發的Android工程師,不少人私下問我,2019年Android進階該怎麼學,方法有沒有?
沒錯,年初我花了一個多月的時間整理出來的學習資料,希望能幫助那些想進階提升Android開發,卻又不知道怎麼進階學習的朋友。【 包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全