Kotlin 核心编程 (26):基础语法 2.3.4

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

Kotlin核心编程(26):基础语法 2.3.4

(方法和成员引用)

内容简介
本书不是一本简单介绍 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 存在一种特殊的语法,通过两个冒号来实现对于某个类的方法进行引用。以上面的代码为例,假如我们有一个 CountryTest 类的对象实例 countryTest,如果要引用它的 isBigEuropeanCountry 方法,就可以这么写:

复制代码
countryTest::isBigEuropeanCountry

为什么使用双冒号的语法?
如果你了解 C#,会知道它也有类似的方法引用特性,只是语法上不同,是通过点号来实现的。然而,C#的这种方式存在二义性,容易让人混淆方法引用表达式与成员表达式,所以 Kotlin 采用::(沿袭了 Java 8 的习惯),能够让我们更加清晰地认识这种语法。

此外,我们还可以直接通过这种语法,来定义一个类的构造方法引用变量。

复制代码
class Book(val name: String)
fun main(args: Array<String>) {
val getBook = ::Book
println(getBook("Dive into Kotlin").name)
}

可以发现,getBook 的类型为 (name: String) -> Book。类似的道理,如果我们要引用某个类中的成员变量,如 Book 类中的 name,就可以这样引用:

复制代码
Book::name

以上创建的 Book::name 的类型为 (Book) -> String。当我们在对 Book 类对象的集合应用一些函数式 API 的时候,这会显得格外有用,比如:

复制代码
fun main(args: Array<String>) {
val bookNames = listOf(
Book("Thinking in Java"),
Book("Dive into Kotlin")
).map(Book::name)
println(bookNames)
}

我们会在 6.2 节再次提到这种应用。

于是,Shaw 便使用了方法引用来传递参数,以下的调用果真奏效了。

复制代码
val countryApp = CountryApp()
val countryTest = CountryTest()
val countries = ……
countryApp.filterCountries(countries, countryTest::isBigEuropeanCountry)

经过重构后的程序显然比之前要优雅许多,程序可以根据任意的筛选需求,调用同一个 filterCountries 方法来获取国家数据。

Kotlin核心编程(26):基础语法 2.3.4

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

评论

发布