扯點題外話,最近體檢報告出來了,頸椎輕度骨質增生轉爲頸椎病了,也有了脂肪肝,可是既然決定了要走技術這一條路,那就堅決的走下去。html
要說lambda在kotlin中的應用,要先說說高階函數less
1、高階函數函數
高階函數是將函數用做參數或返回值的函數。這種函數很好的一個例子是lock(),它接受一個鎖對象和一個函數,獲取鎖,運行函數並釋放鎖:this
fun <T> lock(lock: Lock, body:() -> T): T{
lock.lock()
try{orm
return body()htm
}對象
finally{it
lock.unlock()io
}
}form
使用這個高階函數咱們須要給它的第二個參數傳遞一個函數的引用:
fun toBeSynchronized() = sharedResource.peration()
val result = lock(lock, ::toBesynchronezed)
2、Lambda 表達式和匿名函數
爲了使高階函數的調用更加方便,咱們可使用Lambda表達式或者匿名函數。
一個lambda表達式或匿名函數是一個「函數字面值」,即一個未聲明的函數,但當即做爲表達式傳遞。
看一個例子:
fun <T> max(collection: Collection<T>, less:(T, T) -> Boolean): T? {
var max: T? = null
for (it in collection)
if (max == null || less(max, it))
max = it
return max
}
這是一個高階函數,假如說用來取collection中的最大值
若是咱們不使用lambda表達式或者匿名函數,那要給函數的第二個參數傳遞一個函數的引用:
fun compare(a: Int, b: Int): Boolean = a < b
val max = max(collection, ::compare)
若是使用lambda表達式呢:
val max = max(collection, { a,b -> a < b })
若是使用匿名函數呢:
val max = max(collection, fun(a, b) = a < b)
由上能夠看出來使用lambda表達式更加方便更加清晰的表述的max的功能。
3、lambda 表達式語法
1.lambda表達式的完整語法:
val sum = {x: Int, y: Int -> x + y}
類型標註是可選的,去掉類型標註以下:
val sum = {x, y -> x + y}
2.lambda表達式老是被大括號括着
3.->以前爲參數,->以後爲函數體
4.lambda表達式的最後一個表達式會視爲返回值
5.若是高階函數的最後一個參數是函數,而且咱們以lambda表達式傳遞,那麼咱們能夠把lambda表達式放在()外邊:
val max = max(collection) {a,b -> a < b}
6.若是高階函數只有一個參數,而且以lambda表達式的形式傳遞,那麼咱們能夠省略()
fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
val result = arrayListOf<R>()
for (item in this)
result.add(transform(item))
return result
}-
val doubled = ints.map {value -> value * 2}
7.若是lambda表達式的函數字面值只有一個參數,能夠連同->一塊兒省略,其名稱是it:
val doubled = ints.map {it * 2}
8.lambda表達式的一個缺點是顯示的指定返回類型,若是須要顯示的指定返回類型,可使用匿名函數:
fun(x: Int, y: Int): Int = x + y
9.帶接收者的函數字面值
在函數字面值的函數體中,能夠調用接受者對象上的方法而無需任何額外的限定符,相似於擴展函數,容許你在函數體內訪問接受者對象的成員。
怎麼理解呢?
a. 相似於調用擴展函數的方式
sum: Int.(other: Int) -> Int //接收者類型爲Int
1.sum(2)//咱們能夠認爲給Int類添加了一個成員函數sum
b.在函數字面值的函數體中能夠直接使用接收者的方法
以lambda舉例,可是隻有當接收者類型能夠從上下文推斷時纔可使用:
class HTML {
fun body() {...}
}
fun html(init: HTML() -> Unit): HTML {
val html = HTML()
html.init()//a理解的那樣,像調用HTML的擴展函數同樣
return html
}
html{
body()//b,直接使用接受者HTML中的方法
}
好了,脖子又難受了,就先結束了吧,等之後找時間再繼續補充。
等等,我還有最後一句話:我愛你,即便讓我痛不欲生,由於我相信你可讓我脫胎換骨!