《Kotlin核心编程》 ——2.3.3 函数的类型

举报
华章计算机 发表于 2020/02/21 20:35:35 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第2章,第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内部来调用参数。下一节我们会具体介绍如何使用这种语法。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。