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中的方法

}

 

好了,脖子又难受了,就先结束了吧,等之后找时间再继续补充。

等等,我还有最后一句话:我爱你,即便让我痛不欲生,由于我相信你可让我脱胎换骨!

相关文章
相关标签/搜索