在学习的 Kotlin 的时候,接触到了一个概念,即函数字面值
,有的也叫函数字面量
,(英文:function literal
)。
先是 Google 了一番,在结合 javascript字面量、什么是Scala中的函数字面量? 两篇博客的理解:
函数字面值(量)
即一段函数文本,说白了就是一段代码,可以当作参数来传递。
函数字面量是匿名的,它们在默认情况下没有名称,但是你可以通过将它们绑定到一个变量来给它们一个名字
在 Kotlin 中,Lambda 表达式
、匿名函数
,都是一种 函数字面值。
2019.12.22,我补充了一篇文章,这篇文章理解起来应该更加容易:传送门
函数字面值的定义与使用
首先定义一个 max 函数如下:
// 参数 less 的类型为 (T,T) -> Boolean,即一个函数类型。
fun <T> test(less: (T,T) -> Boolean): T? {
......
less(tmp1,tmp2)
}
在使用的时候
//直接传递给 test 函数
test<String>({a,b -> a.length < b.length})
//先将函数字面量(Lambda 表达式)赋值给一个变量,然后再传递给 test 函数
var p1 = {a:String,b:String -> a.length < b.length}
test<String>(p1)
//先将函数字面量(匿名函数)赋值给一个变量,然后再传递给 test 函数
var p2 = fun(a:Int,b:Int):Boolean {
return a<b
}
test(p2)
//直接传递
test(fun(a:Int,b:Int):Boolean {
return a<b
})
在作为参数传递的过程中,Lambda 表达式
或者匿名函数
并没有执行。而是传递给 test 函数时又被赋值到形参 less 上,然后通过显示的调用 less 来执行传递的函数字面值(也就是一段代码)的。
(注意:Lambda 表达式
与 匿名函数
是有区别的,详见:Kotlin编程之高阶函数,Lambda表达式,匿名函数)
带接收者的函数字面值
参考自:[Kotlin编程之高阶函数,Lambda表达式,匿名函数]
Kotlin 提供了使用指定的 接收者对象 调用函数字面值的功能。 在函数字面值的函数体中,可以调用该 接收者对象上 的 方法而无需任何额外的限定符。
这类似于扩展函数,它允你在函数体内访问接收者对象的成员。
/***
* 带有接收者的函数字面值(Lambda 表达式)
*/
var test6:Int.(other:Int)->Int = {
other->
plus(other) //这里就是没有使用额外的限定符直接调用接收者对象的方法,等价于 this.plus(other)
other + this //最后一句即为返回值
}
(other:Int)->Int
表明变量 test6 的类型,即 (other:Int)->Int 类型(该类型是一种函数类型);Int.
,点左边的类型,用于指定接收者的类型,这里指定为 Int 型;{ other->other+1}
即具体的函数字面值,并赋值给了 test6;- this 指向接收者。
在使用的时候,需要指定接收者
//类似扩展函数的用法,用实例对象来调用
println( 1.test6(2) )
//输出 3
1
即这里的接收者
,定义的函数字面值里面的 this 便是指向了它。
/***
* 带有接收者的函数字面值(匿名函数)
*/
var test7 = fun Int.(other:Int):Int{
return this+other //this是指向接受者的对象
}
println( 1.test7(2))
//输出 3