《Kotlin核心编程》 ——2.3.3 函数的类型
2.3.3 函数的类型
在Kotlin中,函数类型的格式非常简单,举个例子:
(Int) -> Unit
从中我们发现,Kotlin中的函数类型声明需遵循以下几点:
通过->符号来组织参数类型和返回值类型,左边是参数类型,右边是返回值类型;
必须用一个括号来包裹参数类型;
返回值类型即使是Unit,也必须显式声明。
如果是一个没有参数的函数类型,参数类型部分就用()来表示。
() -> Unit
如果是多个参数的情况,那么我们就需要用逗号来进行分隔,如:
(Int, String) -> Unit
此外,Kotlin还支持为声明参数指定名字,如下所示:
(errCode: Int, errMsg: String) -> Unit
在本书的第5章中我们还会介绍Kotlin中的可空类型,它将支持用一个“?”来表示类似Java 8中Optional类的效果。如果errMsg在某种情况下可空,那么就可以如此声明类型:
(errCode: Int, errMsg: String?) -> Unit
如果该函数类型的变量也是可选的话,我们还可以把整个函数类型变成可选:
((errCode: Int, errMsg: String?) -> Unit)?
这种组合是不是非常有意思?还没完,我们说过,高阶函数还支持返回另一个函数,所以还可以这么做:
(Int) -> ((Int) -> Unit)
这表示传入一个类型为Int的参数,然后返回另一个类型为(Int) -> Unit的函数。简化它的表达,我们可以把后半部分的括号给省略:
(Int) -> Int -> Unit
需要注意的是,以下的函数类型则不同,它表示的是传入一个函数类型的参数,再返回一个Unit。
((Int) -> Int) -> Unit
好了,在学习了Kotlin函数类型知识之后,Shaw便重新定义了filterCountries方法的参数声明。
fun filterCountries(
countries: List<Country>,
test: (Country) -> Boolean): List<Country> // 增加了一个函数类型的参数test
{
val res = mutableListOf<Country>()
for (c in countries) {
if (test(c)) { // 直接调用test来进行筛选
res.add(c)
}
}
return res
}
那么,下一个问题来了。我们如何才能把代码清单2-1中的isBigEuropeanCountry方法传递给filterCountries呢?直接把isBigEuropeanCountry当参数肯定不行,因为函数名并不是一个表达式,不具有类型信息,它在带上括号、被执行后才存在值。可以看出,我们需要的是一个单纯的方法引用表达式,用它在filterCountries内部来调用参数。下一节我们会具体介绍如何使用这种语法。
- 点赞
- 收藏
- 关注作者
评论(0)