Lambda
-
基本形式:
函数类型 – (R, T) -> R,因此 fold 接受一个函数作为参数, 该函数接受类型分别为 R 与 T 的两个参数并返回一个 R 类型的值。
-> 后面接的是函数体,函数体的最后一句表达式结果就是lambda表达式的返回值 -
lambda表达式的本质是匿名函数,在底层以匿名函数来实现
减少了代码量编写,同时使代码更加简洁明了
Lambda表达式的特点
- Lambda表达式总是被大括号括着
- 其参数(如果存在)在 -> 之前声明(参数类型可以省略)
- 函数体(如果存在)在 -> 后面。
总结:
lambda表达式是一个语法糖(所谓与语法糖,就是对程序员友好的东西),lambda总是被大括号包裹着
Lambda 表达式用法
-
无参数的情况 :
val/var 变量名 = { 操作的代码 } -
有参数的情况
val/var 变量名 : (参数的类型,参数类型,…) -> 返回值类型 = {参数1,参数2,… -> 操作参数的代码 }
可等价于
// 此种写法:即表达式的返回值类型会根据操作的代码自推导出来。
val/var 变量名 = { 参数1 : 类型,参数2 : 类型, … -> 操作参数的代码 }
- lambda表达式作为函数中的参数的时候,这里举一个例子:
fun test(a : Int, 参数名 : (参数1 : 类型,参数2 : 类型, … ) -> 表达式返回类型){
…
}
匿名函数:
- 匿名函数的特点是可以明确指定其返回值类型。
- 它和常规函数的定义几乎相似。他们的区别在于,匿名函数没有函数名。
- 匿名函数和lambda表达式的区别:
- 匿名函数的参数传值,总是在小括号内部传递。而Lambda表达式传值,可以有省略小括号的简写写法。
- 在一个不带标签的return语句中,匿名函数时返回值是返回自身函数的值,而Lambda表达式的返回值是将包含它的函数中返回。
下划线:
val map = mapOf(“key1” to “value1”,“key2” to “value2”,“key3” to “value3”)
map.forEach{
key , value -> println("$key \t $value")
}
// 不需要key的时候
map.forEach{
_ , value -> println("$value")
}
闭包
java:不支持闭包,因此对象是他的一等公民,而函数,变量是二等公民
kotlin:支持闭包,函数中可以嵌套函数(如:匿名函数,lambda,局部函数,表达式),因此函数和变量是一等公民,而对象属于二等公民
闭包的形式
-
携带状态
-
引用外部变量,并改变外部变量的值
注意:
-
Lambda 只会返回闭包传递的最后一个返回值
-
语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
之所以叫语法糖,不只是因为加糖后的代码功能与加糖前的保持一致,更重要的是,糖在不改变其所在位置的语法结构的前提下,实现了运行时的等价