本文共 1233 字,大约阅读时间需要 4 分钟。
之前在学习 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-1tmp = { 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-1method({ num -> (num > 10) })// 2-2method({ num -> (num >= 0) })
对于 1-1 对应的函数字面量,其执行结果就为 false,即会打印 fasle;
对于 1-2 对应的函数字面量,其执行结果就为 true,即会打印 true;类比到 Java 中,其实就类似于定义一个只有一个方法的接口,前面说的 “函数类型” 即对应该接口类型,而函数字面值,则对应着接口方法的具体实现。
转载地址:http://nrerj.baihongyu.com/