Kotlin 核心编程 (25):基础语法 2.3.3

阅读数:1 2019 年 12 月 25 日 15:33

Kotlin核心编程(25):基础语法 2.3.3

(函数的类型)

内容简介
本书不是一本简单介绍 Kotlin 语法应用的图书,而是一部专注于帮助读者深入理解 Kotlin 的设计理念,指导读者实现 Kotlin 高层次开发的实战型著作。书中深入介绍了 Kotlin 的核心语言特性、设计模式、函数式编程、异步开发等内容,并以 Android 和 Web 两个平台为背景,演示了 Kotlin 的实战应用。
全书共 13 章,分为 4 个部分:
热身篇—Kotlin 基础(第 1~2 章),简单介绍了 Kotlin 设计哲学、生态及基础语法,其中包括 Kotlin 与 Scala、Java 之间的关联与对比,以及 Kotlin 的类型声明的特殊性、val 和 var 的使用、高阶函数的使用、面向表达式编程的使用、字符串的定义与操作等内容;
下水篇—Kotlin 核心(第 3~8 章),深入介绍了面向对象、代数数据类型、模式匹配、类型系统、Lambda、集合、多态、扩展、元编程等 Kotlin 开发核心知识,这是本书的重点,其中涉及很多开发者特别关心的问题,比如多继承问题、模式匹配问题、用代数数据类型抽象业务问题、泛型问题、反射问题等。
潜入篇—Kotlin 探索(第 9~11 章),探索 Kotlin 在设计模式、函数式编程、异步和并发等编程领域的应用,其中包括对 4 大类设计模式、Typeclass 实现、函数式通用结构设计、类型替代异常处理、共享资源控制、CQRS 架构等重点内容的深入剖析;
遨游篇—Kotlin 实战(第 12~13 章),着重演示了 Kotlin 在 Android 和 Web 平台的实战案例,其中涉及架构方式、单向数据流模型、解耦视图导航、响应式编程、Spring 5 响应式框架和编程等内容。

在 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 内部来调用参数。下一节我们会具体介绍如何使用这种语法。

Kotlin核心编程(25):基础语法 2.3.3

购书地址 https://item.jd.com/12519581.html?dist=jd

评论

发布