高阶函数
函数类型
Kotlin中,函数的参数类型可以是函数类型。
函数类型不是一个类型,而是一类类型,函数类型,可以有各种各样的不同的参数和返回值类型的搭配,例如无参数->无返回值 和 Int->String 是两种不同的类型。
高阶函数的写法
高阶函数:参数/返回值为函数类型的函数。
下图中的函数a和c都是高阶函数。
注意:高阶函数没有任何特殊功能,就是一类函数。
函数作为参数传递/变量赋值
- Kotlin中,函数可以作为对象存在,来作为参数传入函数中,或者给变量赋值。但是要这么做,就要在函数名的左边加上
::。这么做实际上创建了一个和函数具有相同功能的对象。 - 注意,这个对象并不是原函数本身,这个对象只是一个函数类型的对象。
对象不能加括号来调用,但是函数类型的对象可以,因为这是一个假调用,实际上真正调用的不是这个对象,而是这个对象的invoke函数。
写法
函数作为变量赋值
函数作为参数传递
写法1:
写法2:匿名函数
函数体直接取代函数名,也就是将函数定义与传参合二为一。这种写法就叫匿名函数,因为此时没有必要写函数名了,Kotlin干脆就不让写了。
匿名函数
接前面的内容继续探讨匿名函数。
以下例子中可以很好地体现高阶函数和匿名函数的意义。Java中,我们使用OnClickListener接口实际上就是为了传递一个方法,在Kotlin中通过高阶函数就可以达到同样的效果。
Java中:
Kotlin中:
简化为lambda表达式:
lambda表达式
- 接前面的例子继续说,如果lambda是函数的最后一个参数,则可以把lambda写在括号外。
- 如果lambda是唯一的参数,还可以直接去掉括号。
- 如果lambda只含有一个参数,还可以省略这个参数。因为Kotlin的lambda对省略掉唯一参数有默认的名字
it。
- 函数赋值给变量的时候,如果简写成lambda的形式,则需要指明lambda的返回值类型,因为编译器无法通过上下文推断lambda的类型。
可以给待赋值的变量指明类型,这样就不需要指明lambda的返回值类型。
注意:lambda不用写return,它的最后一行代码就是返回值。
总结
匿名函数不是函数,而是一个函数类型的对象,所以匿名函数才能直接作为函数的参数用来传递,或可以被赋值给变量。 同理,lambda其实也是一个函数类型的对象。