一、声明高阶函数
高阶函数定义:高阶函数就是以另一个函数作为参数或者返回值的函数。 在kotlin中,函数可以用lambda或者函数引用来表示。因此,任何以lambda或者函数引用作为参数的函数,或者返回值为lamda或函数应用的函数,或者两者都满足的函数都是高阶函数。
1、函数类型
为了声明一个以lamda作为实参的函数,你需要知道如何声明对应形参的类型。在这之前,我们先来看一个简单的例子,把lambda表达式保存在局部变量中。其实我们已经见过在不声明类型的情况下如何做到这一点,这依赖于kotlin的类型推导。
在这个例子中,编译器推导出sum和action这两个变量具有函数类型。现在我们来看看这些变量的显式类型声明是什么样的:
声明函数类型,需要将函数参数类型放在括号中,紧接着是一个箭头和函数的返回类型。
你应该还记得,Unit类型用于表示函数不返回任何有用的值。在声明一个普通的函数时,Unit类型的值是可以省略的,但是一个函数类型声明总是需要一个显式的返回类型,所以在这种场景下Unit是不能省略的。
注意,在lambda表达式{x, y -> x + y}中是如何省略参数x, y的类型的。因为它们的类型已经在函数类型的变量声明部分指定了,不需要在lamda本身的定义当中再重复声明。
就像其他方法一样,函数类型的返回值也可以标记为可空类型:
也可以定义一个函数类型的可空变量。为了明确表示是变量本身可空,而不是函数类型的返回类型可空,你需要将整个函数类型的定义包含在括号内并在括号后面添加一个问号:
注意这个例子和前一个例子的微妙区别。如果省略了括号,声明的将会是一个返回值可空的函数类型,而不是一个可空的函数的变量。