lambda for kotlin

        扯點題外話,最近體檢報告出來了,頸椎輕度骨質增生轉爲頸椎病了,也有了脂肪肝,可是既然決定了要走技術這一條路,那就堅決的走下去。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中的方法

}

 

好了,脖子又難受了,就先結束了吧,等之後找時間再繼續補充。

等等,我還有最後一句話:我愛你,即便讓我痛不欲生,由於我相信你可讓我脫胎換骨!

相關文章
相關標籤/搜索