之前在学习 Kotlin 的时候,有整理了一篇关于 函数字面值 的博客。然后今天再回顾相关知识点的时候,感觉对这个概念加深了一点理解,而且之前那篇文章可能说得不太明白,于是这里又整理下相关的想法,做一个补充,希望能够帮助大家更加通俗的理解这个概念。
首先,函数字面值(量)即一段函数文本,说白了就是一段代码,可以当作参数来传递。
比如下面的:
var tmp: ((Int) -> Boolean)? = null
定义了一个变量 tmp,而该变量的类型就是 (Int) -> Boolean 这一函数类型(可为空的),该类型的函数,需要传递一个 Int 类型的参数,返回 Boolean 类型的值。
这就跟下面的是类似
var tmp2: String? = null
定义一个变量 tmp2,而该变量的类型就是 String 类型,即字符串类型。
当然, tmp 暂时只是定义了类型,然后如果给它赋值的话,可以是:
// 1-1
// num 即对应 Int 类型的参数,(num>10) 是一个表达式,对应着 Boolean 类型的返回值
tmp = { num -> (num > 10) }
此时,num -> (num > 10) 即是一个函数字面值,或者说,这个函数字面值即指的是 num -> (num > 10)。
(题外话,如果函数只有一个参数的话,则该参数可以省略,默认以 it 关键字代替)

当然,tmp 的具体实现是不定的,可以是上面写的那样,也可以是:
// 2-1
tmp = { num -> (num >= 0) }
这里就对应另外一种函数字面值了。
以上说到的两种不同的函数字面值,他们唯一的共同点就是属于 (Int) -> Boolean 类型。
接下来还有一点,既然是变量,就可以作为方法参数传递,比如我定义一个方法:
fun method(a: ((Int) -> Boolean)?) {
val b = a?.invoke(3)
println(b)
}
该方法的参数 a 同样也是 (Int) -> Boolean 这一函数类型,因此,在使用该 method() 方法时,就可以传递之前的两种函数字面值,即 1-1 和 1-2 两种不同的函数字面值。然后通过 invoke() 来触发其执行,当然,需要传递一个 Int 类型的参数。
// 2-1
method({ num -> (num > 10) })
// 2-2
method({ num -> (num >= 0) })
对于 1-1 对应的函数字面量,其执行结果就为 false,即会打印 fasle;
对于 1-2 对应的函数字面量,其执行结果就为 true,即会打印 true;
类比到 Java 中,其实就类似于定义一个只有一个方法的接口,前面说的 “函数类型” 即对应该接口类型,而函数字面值,则对应着接口方法的具体实现。
本文深入浅出地解析了Kotlin中的函数字面值概念,解释了如何定义和使用函数字面值,以及它们如何作为参数进行传递。通过实例展示了函数字面值在方法调用中的应用,并对比了其与Java接口实现的区别。
1093

被折叠的 条评论
为什么被折叠?



