05 Kotlin的函数类型&lambda表达式

144 阅读2分钟

高阶函数

函数类型

Kotlin中,函数的参数类型可以是函数类型。

函数类型不是一个类型,而是一类类型,函数类型,可以有各种各样的不同的参数和返回值类型的搭配,例如无参数->无返回值Int->String 是两种不同的类型。

高阶函数的写法

高阶函数:参数/返回值为函数类型的函数。

下图中的函数a和c都是高阶函数。 image.png

注意:高阶函数没有任何特殊功能,就是一类函数。

函数作为参数传递/变量赋值

  • Kotlin中,函数可以作为对象存在,来作为参数传入函数中,或者给变量赋值。但是要这么做,就要在函数名的左边加上::。这么做实际上创建了一个和函数具有相同功能的对象。
  • 注意,这个对象并不是原函数本身,这个对象只是一个函数类型对象

image.png

对象不能加括号来调用,但是函数类型的对象可以,因为这是一个假调用,实际上真正调用的不是这个对象,而是这个对象的invoke函数。

image.png

写法

函数作为变量赋值

image.png

函数作为参数传递

写法1:

image.png

写法2:匿名函数

函数体直接取代函数名,也就是将函数定义与传参合二为一。这种写法就叫匿名函数,因为此时没有必要写函数名了,Kotlin干脆就不让写了。 image.png

匿名函数

接前面的内容继续探讨匿名函数。

以下例子中可以很好地体现高阶函数和匿名函数的意义。Java中,我们使用OnClickListener接口实际上就是为了传递一个方法,在Kotlin中通过高阶函数就可以达到同样的效果。

Java中:

image.png

Kotlin中:

image.png

简化为lambda表达式:

image.png

lambda表达式

  • 接前面的例子继续说,如果lambda是函数的最后一个参数,则可以把lambda写在括号外。

image.png

  • 如果lambda是唯一的参数,还可以直接去掉括号。

image.png

  • 如果lambda只含有一个参数,还可以省略这个参数。因为Kotlin的lambda对省略掉唯一参数有默认的名字it

image.png

  • 函数赋值给变量的时候,如果简写成lambda的形式,则需要指明lambda的返回值类型,因为编译器无法通过上下文推断lambda的类型。

image.png

可以给待赋值的变量指明类型,这样就不需要指明lambda的返回值类型。

image.png

注意:lambda不用写return,它的最后一行代码就是返回值。

总结

匿名函数不是函数,而是一个函数类型的对象,所以匿名函数才能直接作为函数的参数用来传递,或可以被赋值给变量。 同理,lambda其实也是一个函数类型的对象。