最近在网站上看了看Lambda表达式在Kotlin中的使用,借鉴了大牛一些讲解的内容,这里简单记录了下重点内容,先看下目录
1.Lambda介绍
Lambda表达式属于函数式编程语言,区别于Java面向对象编程语言。它本质是`匿名函数,因为底层就是匿名函数实现的。
2.Lambda的使用
2.1Lambda表达式的特点
Lambda表达式总是被大括号包裹着,箭头前面是参数(可有可无),参数类型可以省略,箭头后面是函数体。
2.2Lambda的语法
无参:
var noParamMethod = {
println(“无参的方法”)
}
调用 === noParamMethod() 结果 === “无参的方法”
有参:
var haveParamMethod = {s1:Int,s2:Int ->s1+s2}
调用 === haveParamMethod(1,2) 结果 === 3
lambda作为函数中的参数:
fun paramInFunction(a:Int,参数名:(参数名:参数类型,参数名:参数类型) ->表达式返回类型){
... ...
}
例如
fun paramFunction(a:Int,b:(num1,num2)->num1+num2):Int{
return a+b.invoke(2,3)
}
调用 === paramInFunction(3,{num1,numb2 -> num1+numb2}) 结果 === 8
注意这里的Lambda表达式被大括号包裹着。
3.Lambda实践
3.1使用it
it在kotlin中不是一个关键字,它是可以作为变量名称的,例如
val it = 3
it 在当函数只有一个参数的时候可以表示这个参数,例如
fun testIt(a:Int,boolValue:((Int)->Boolean)):Int{
return if(boolValue(a)){
a
}else{
0
}
}
调用 === testIt(10){it>3} 打印结果 === 10
调用 === testIt(2){it>3} 打印结果 === 0
3.2使用下划线(_)
Lambda可以使用下划线”_”来表示不需要处理的参数,map中用的居多,例如
map.forEach { (key, value) ->
println("$key \t $value")
}
map.forEach { (_, value) ->
println("$value")
}
3.3匿名函数
匿名函数与普通函数的区别就是没有函数名称
val result1 = fun(a: Int, b: Int) = a + b 匿名函数
var result2 = { a: Int, b: Int -> a + b } Lambda表达式
匿名函数与Lambda表达式的区别有:
匿名函数的参数必须有小括号包裹,Lambda可以省略;
匿名函数在一个不带标签的return语句中,返回值是自身函数的值,
Lambda返回值是包含它的函数中返回。
3.4带接收者函数的Lambda表达式
class HTML {
fun body() { …… }
}
fun html(init: HTML.() -> Unit): HTML {
val html = HTML() // 创建接收者对象
html.init() // 将该接收者对象传给该 lambda
return html
}
html { // 带接收者的 lambda 由此开始
body() // 调用该接收者对象的一个方法
}
3.5闭包
闭包就是函数中包含函数。
Java是面向对象编程语言,因此不支持闭包,Kotlin支持闭包。
函数返回函数,并携带状态:
fun testLambdaMethod(a:Int):()->Int{
var b = 3
return fun():Int{
b++
return a+b
}
}
val t = testLambdaMethod(3)
println(t())
println(t())
println(t())
调用 === testLambdaMethod(3) 第一次结果 === 7 第二次结果 === 8 第三次结果 === 9
因为返回的是函数,而返回的函数还有返回值,所以这里打印的应该是t(),并且b的值也保留下来了。
引用外部变量,并改变外部变量的值:
var num: Int = 5
val list = listOf(3, 4, 5, 6, 7)
list.filter { it < 6 }.forEach { num += it }
println(num)
结果 === 17
4.总结
Lambda本身实质就是匿名函数实现的;
单个参数可以用it表示;
多个参数可以用_代替某个不用的参数;
闭包是函数包含函数,Java不支持闭包,Kotlin支持闭包。