【Kotlin】—— 函数字面值(量)

版权声明:转载请标明出处「OneDeveloper」 https://blog.csdn.net/OneDeveloper/article/details/82907555

在学习的 Kotlin 的时候,接触到了一个概念,即函数字面值,有的也叫函数字面量,(英文:function literal)。

先是 Google 了一番,在结合 javascript字面量什么是Scala中的函数字面量? 两篇博客的理解:
函数字面值(量)即一段函数文本,说白了就是一段代码,可以当作参数来传递。

函数字面量是匿名的,它们在默认情况下没有名称,但是你可以通过将它们绑定到一个变量来给它们一个名字

在 Kotlin 中,Lambda 表达式匿名函数,都是一种 函数字面值。


函数字面值的定义与使用

首先定义一个 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

猜你喜欢

转载自blog.csdn.net/OneDeveloper/article/details/82907555