扯点题外话,最近体检报告出来了,颈椎轻度骨质增生转为颈椎病了,也有了脂肪肝,可是既然决定了要走技术这一条路,那就坚决的走下去。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中的方法
}
好了,脖子又难受了,就先结束了吧,等之后找时间再继续补充。
等等,我还有最后一句话:我爱你,即便让我痛不欲生,由于我相信你可让我脱胎换骨!