描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302591207
本书几乎涵盖了Kotlin所有的特性,包括函数特性、面向对象特性、元编程、DSL、跨平台开发、协程、Flow、RxJava、Jetpack等,内容非常丰富。
本书还介绍了使用Kotlin开发的多个实例,如移动端实战、服务端实战、响应式开发实战等,这些例子是对本书知识的综合运用,对使用Kotlin进行开发的读者具备较大的参考价值。
本书是编者系统学习Kotlin和多年实战经验的积累和总结,通过非常简易的代码讲解Kotlin语言的各种特性,代码实例不会涉及过于抽象的业务场景,但会通过具体代码实例对Kotlin语言背后的设计思想和原理进行详细分析,力图使读者通过实际操作快速上手和深入理解Kotlin语言的相关知识。
本书面向所有希望从事 Android 开发和服务端开发的IT从业人员,希望读者通过阅读本书,使用Kotlin开发应用程序的技能更上一层楼。
本书详细介绍了Kotlin语言方方面面的特性,包括各种类型的函数,贯彻本书始终的Lambda表达式,有别于Java的委托、泛型,灵活、简洁的DSL,常用的语法糖,相比线程更加轻量级的协程,参考RxJava实现的Flow,等等。本书还提供了大量涉及移动端、服务端甚至桌面端的案例,这些案例都是编者使用Kotlin之后的实践和心得,同时包含很多编者封装的library,供读者参考、借鉴和使用。 本书适合有一定Kotlin语法基础的读者使用,尤其适合移动端和服务端的开发人员使用,也可以用作大专院校和培训机构的教学参考书。
第1章 认识Kotlin 1
1.1 Kotlin简介 1
1.1.1 Kotlin的历史 1
1.1.2 Kotlin的特性 1
1.2 Kotlin的发展 2
1.2.1 实用主义 2
1.2.2 生态圈 3
1.2.3 逐渐Kotlin化的Java 3
1.3 总结 3
第2章 Kotlin的函数与类 4
2.1 函数的基本概念 4
2.1.1 函数的参数 5
2.1.2 函数 8
2.2 Kotlin的类(一) 11
2.2.1 构造函数和初始化块 12
2.2.2 属性 15
2.2.3 抽象类 16
2.2.4 嵌套类和内部类 16
2.2.5 枚举类 17
2.3 Kotlin的类(二) 18
2.3.1 对象声明和对象表达式 18
2.3.2 伴生对象 19
2.3.3 数据类 20
2.3.4 密封类 23
2.4 总结 24
第3章 Kotlin的函数式编程 25
3.1 函数式编程与高阶函数 25
3.1.1 函数式编程 25
3.1.2 高阶函数 25
3.2 Lambda表达式 29
3.2.1 Java 8的Lambda 29
3.2.2 Kotlin的Lambda语法 31
3.2.3 简化Kotlin的Lambda表达式 31
3.2.4 方法引用 32
3.2.5 Kotlin支持SAM转换 33
3.2.6 使用高阶函数的例子 34
3.2.7 换个角度看 Lambda表达式 35
3.3 集合、序列和Java中的流 38
3.3.1 集合中的函数式API 38
3.3.2 序列和流 41
3.4 总结 41
第4章 内联函数与扩展函数 42
4.1 内联函数 42
4.1.1 inline的使用 42
4.1.2 禁用内联——noinline 45
4.1.3 非局部返回以及crossinline的使用 47
4.2 内联属性 48
4.2.1 内联属性 48
4.2.2 内联类 48
4.3 扩展函数 48
4.3.1 扩展函数的特性 48
4.3.2 常用标准库的扩展函数 51
4.4 扩展属性 56
4.5 总结 60
第5章 委托 61
5.1 委托介绍 61
5.1.1 静态代理 61
5.1.2 动态代理 62
5.2 Kotlin的委托模式和委托属性 64
5.2.1 委托模式 64
5.2.2 委托属性 65
5.3 lateinit和by lazy 69
5.4 总结 73
第6章 泛型 74
6.1 类型擦除 74
6.1.1 Java泛型的优点 74
6.1.2 Kotlin的泛型 75
6.1.3 Java通过类型擦除支持泛型 75
6.1.4 Kotlin如何获得声明的泛型类型 77
6.2 型变 80
6.2.1 类和类型 80
6.2.2 型变 80
6.3 泛型约束、类型投影与星号投影 83
6.3.1 泛型约束 83
6.3.2 类型投影 84
6.3.3 星号投影 84
6.3.4 泛型的应用 85
6.4 总结 86
第7章 元编程 87
7.1 元编程 87
7.1.1 元编程介绍 87
7.1.2 元编程的分类 87
7.1.3 根本没有什么元编程,从来只有编程而已 88
7.2 Kotlin反射概述 88
7.2.1 概述 88
7.2.2 Kotlin反射API 89
7.3 Java反射和Kotlin反射(上) 90
7.3.1 类引用,获取Class对象 90
7.3.2 构造函数引用,获取类的构造函数 91
7.3.3 函数引用,获取类的成员函数 92
7.3.4 属性引用,获取类的成员变量 94
7.4 Java反射和Kotlin反射(下) 96
7.4.1 获取类的其他信息 96
7.4.2 Java反射与Kotlin反射的互操作性 98
7.5 总结 99
第8章 DSL的构建 100
8.1 DSL介绍 100
8.2 构建一个DSL的多种方式 101
8.2.1 带接收者的函数类型 101
8.2.2 带接收者的Lambda 101
8.2.3 创建一个自己的DSL 102
8.2.4 将扩展函数改成DSL的方式 104
8.2.5 使用运算符重载实现DSL 105
8.2.6 使用中缀表达式实现DSL 106
8.2.7 Kotlin DSL的实际使用——封装路由框架的使用 107
8.3 总结 108
第9章 常用语法糖与设计模式 110
9.1 运算符重载 110
9.2 中缀表达式 112
9.2.1 在扩展函数中使用中缀表达式 113
9.2.2 在成员函数中使用中缀表达式 113
9.3 作用域函数 114
9.3.1 作用域函数的概念 114
9.3.2 如何优雅地使用作用域函数 114
9.4 Contract契约 118
9.4.1 Contract的概念 119
9.4.2 Contract的特性 119
9.4.3 Contract源码解析 120
9.4.4 小结 122
9.5 在data class中使用MapStruct 122
9.5.1 data class的copy()为浅拷贝 122
9.5.2 MapStruct简介 123
9.5.3 在Kotlin中使用MapStruct 123
9.6 更好地使用设计模式 126
9.6.1 单例模式 126
9.6.2 builder模式 127
9.6.3 观察者模式 128
9.6.4 状态模式 129
9.7 总结 130
第10章 跨平台开发 131
10.1 跨平台的简单介绍 131
10.1.1 跨平台开发的愿景 131
10.1.2 跨平台开发当前的主流技术 131
10.1.3 Kotlin与Flutter的对比 132
10.2 利用Ktor-Client实现跨平台网络请求 132
10.2.1 什么是Ktor 132
10.2.2 Ktor-Client的使用 132
10.3 总结 142
第11章 协程及其应用 143
11.1 协程的基本概念 143
11.1.1 协程的定义 143
11.1.2 为何要使用协程 143
11.1.3 Kotlin协程的基本概念 148
11.2 Coroutine builders 149
11.2.1 launch和async 149
11.2.2 runBlocking 152
11.3 挂起函数 152
11.3.1 delay 152
11.3.2 yield 153
11.3.3 withContext 154
11.3.4 coroutineScope 156
11.4 协程的上下文和调度 156
11.4.1 协程的调度 156
11.4.2 父子协程 158
11.4.3 多个CoroutineContext进行“ ”操作 160
11.4.4 CoroutineContext Job 161
11.5 协程的作用域 CoroutineScope 162
11.5.1 尽量少用GlobalScope 162
11.5.2 安全地使用CoroutineScope 163
11.5.3 在Android中更好地使用Coroutines 163
11.6 Channel机制 164
11.6.1 生产者和消费者 164
11.6.2 管道 165
11.6.3 channel缓冲 167
11.6.4 actor 168
11.6.5 Select表达式 169
11.7 总结 170
第12章 Flow的基本使用 171
12.1 Flow的使用 171
12.1.1 Kotlin Flow介绍 171
12.1.2 Flow的基本使用方式 171
12.1.3 Flow的生命周期 176
12.2 Flow和RxJava 177
12.2.1 Flow和Sequences 177
12.2.2 Flow和RxJava 178
12.3 Flow的异常处理 182
12.3.1 catch操作符 182
12.3.2 retry、retryWhen操作符 184
12.4 Flow的线程操作 185
12.4.1 更为简化的线程切换 185
12.4.2 flowOn和RxJava的observeOn 185
12.4.3 buffer实现并发操作 186
12.4.4 并行操作 188
12.5 Flow其他的操作符 189
12.5.1 转换操作符 189
12.5.2 限制大小的操作符 189
12.5.3 终端操作符 189
12.5.4 合并操作符 190
12.5.5 扁平化操作符 193
12.6 总结 195
第13章 RxJava的新特性及常用操作符 198
13.1 RxJava入门 198
13.1.1 RxJava入门理念 198
13.1.2 RxJava的基础知识 199
13.1.3 RxJava的生命周期 201
13.2 RxJava 3新特性描述 204
13.2.1 主要特性讲解 204
13.2.2 与RxJava 2.x的区别 204
13.2.3 RxJava 3新特性部分详述 204
13.3 常用操作符讲解 207
13.3.1 创建操作符 207
13.3.2 转换操作符 215
13.3.3 过滤操作符 220
13.4 总结 227
第14章 RxJava的核心机制 229
14.1 ObservableSource、Observable、Observer的同流合污 229
14.2 恐怖的Function机制 230
14.3 线程的决策者Scheduler 231
14.3.1 Scheduler工作核心Worker 232
14.3.2 Scheduler线程池核心RxThreadFactory 232
14.3.3 异步实践例子 233
14.3.4 并行的操作 234
14.4 Observeable五兄弟的差异性 235
14.4.1 Observable 235
14.4.2 Flowable 238
14.4.3 Single 239
14.4.4 Completable 240
14.4.5 Maybe 240
14.5 背压策略 241
14.5.1 MISSING 242
14.5.2 ERROR 242
14.5.3 BUFFER 242
14.5.4 DROP 243
14.5.5 LATEST 243
14.6 总结 243
第15章 Jetpack 244
15.1 Jetpack介绍 244
15.1.1 客户端的架构迭代 244
15.1.2 AAC的功能 246
15.1.3 Android Jetpack 247
15.2 Lifecycle 249
15.2.1 Lifecycle介绍 249
15.2.2 Lifecycle的使用 250
15.2.3 Retrofit结合Lifecycle 253
15.3 ViewModel 254
15.3.1 ViewModel介绍 254
15.3.2 ViewModel的使用 255
15.3.3 使用Kotlin委托属性创建ViewModel 256
15.3.4 AndroidViewModel 257
15.3.5 ViewModel源码简单分析 257
15.4 LiveData 261
15.4.1 LiveData介绍 261
15.4.2 LiveData的使用 262
15.4.3 在ViewModel中使用LiveData 263
15.4.4 LiveData实现Fragment之间的通信 264
15.4.5 LiveData源码简单分析 265
15.5 Room的用法 267
15.5.1 Room的基本了解 267
15.5.2 Room的配置与使用 268
15.5.3 常用的SQL操作 270
15.5.4 Room的兼容与升级 271
15.5.5 小结 275
15.6 Navigation用法详解 276
15.6.1 Navigation的配置 276
15.6.2 Navigation的基本使用 277
15.6.3 Navigation原理解析 284
15.6.4 小结 287
15.7 总结 287
第16章 Android实战 288
16.1 构建一个日志框架 288
16.1.1 Android日志框架L 288
16.1.2 如何开发一款类似L的日志框架 289
16.1.3 记录Android日志更好的方式 297
16.2 网络诊断工具 297
16.3 使用Netty构建一个在Android上运行的Web服务器 304
16.3.1 开发背景 304
16.3.2 AndroidServer的特性 304
16.3.3 AndroidServer的设计原理 304
16.3.4 AndroidServer的使用 310
16.4 实现协程版本的EventBus 313
16.4.1 RxJava版本的EventBus 313
16.4.2 Kotlin Coroutine版本的EventBus 317
16.4.3 小结 322
16.5 总结 322
第17章 响应式开发实战 323
17.1 封装一个基于RxJava的任务框架RxTask 323
17.1.1 RxTask奠基石的实现 324
17.1.2 利用奠基石实现多种Task 328
17.1.3 RxTask的改进,针对Java、Android平台进行适应 335
17.2 基于Kotlin、RxJava实现的有限状态机 339
17.2.1 状态机 339
17.2.2 常用的状态机分类 339
17.2.3 Kotlin开发的FSM 340
17.2.4 应用 351
17.3 Kotlin、RxJava以及传统的机器学习在手机质检上的应用 353
17.3.1 业务背景 353
17.3.2 设计思路 353
17.3.3 代码实现以及踩过的坑 355
17.3.4 后续的规划 361
17.4 总结 361
第18章 服务端实战 362
18.1 使用Ktor快速开发Web项目 362
18.1.1 Ktor介绍 362
18.1.2 Ktor服务端的使用 362
18.1.3 例子 365
18.2 使用WebFlux R2DBC开发Web项目 369
18.2.1 R2DBC介绍 369
18.2.2 R2DBC的使用 370
18.2.3 小结 376
18.3 使用NetDiscovery开发网络爬虫 376
18.3.1 NetDiscovery介绍 376
18.3.2 DSL在爬虫框架中的使用 379
18.3.3 Kotlin Coroutines在爬虫框架中的使用 384
18.4 实现智能硬件的远程控制系统(上) 388
18.4.1 业务背景及远程控制系统的功能 388
18.4.2 远程控制系统服务端的设计 388
18.4.3 远程控制系统的数据流向 389
18.4.4 远程控制系统服务端的相关代码 390
18.4.5 远程控制系统后续的规划 397
18.5 实现智能硬件的远程控制系统(下) 397
18.5.1 远程控制的客户端介绍 397
18.5.2 Watcher的设计 398
18.5.3 Watcher的核心代码 399
18.5.4 小结 408
18.6 总结 408
Kotlin是一门务实的语言。Kotlin从发展之初就受到各种语言(例如Java、C#、JavaScript、Scala、Groovy、Python等)的影响,或者说Kotlin集各家语言之长,吸收了各种语言比较好的特性。在JVM环境下,Kotlin被设计成可以和Java代码相互操作,并可以重复使用Java现有函数库和框架的语言。
在2016年年底,笔者工作之余,开始研究Kotlin这门语言。顺便尝试使用Kotlin编写一些Android上的组件。
随后,在2017-2018年,笔者负责的移动端团队开始尝试使用Kotlin编写全新的App。此时恰逢谷歌宣布使用Kotlin作为Android的官方语言,这更加坚定了我们使用Kotlin的决心。个人也在此期间尝试使用Kotlin来编写服务端的程序。到了2019年年初,笔者跳槽到了万物新生(当时还是爱回收)的创新中心。在这里,我们服务端的主力语言就是Kotlin。使用Kotlin编写后端服务在当时甚至到现在都是一件比较酷的事情。
这些年来,笔者在两家公司使用Kotlin做了很多项目,从App到桌面程序再到服务端程序,积累了很多相关的编程经验。因此编写了本书,希望通过本书能让读者了解这门务实的语言,以及尝试使用这门语言。Kotlin也是基于JVM的语言,上手不难,但是其思想跟Java大相径庭。
每隔几年,我们都会听到一种声音“xxx语言将会取代Java”,取代Java的语言也从之前的C#、PHP、Python变成了Go、Kotlin。其实,只要从TIOBE的榜单就可以看到,这些年来Java 一直占据着这份榜单前三的位置,甚至很多年来都是。Java庞大的生态系统、海量的项目决定了其在未来很多年内不可能被取代。
题外话,在下一代的Java虚拟机Graal VM中,除了支持基于JVM的语言Java、Scala、Groovy、Kotlin等外,还支持JavaScript、Python、Ruby、R,以及基于LLVM的C、C 、Rust。Graal VM会让Java变得更加强大。
Kotlin的出现是为了编写更好的Java,Kotlin可以与Java进行互操作,并且Kotlin有自己独特的优势:
? 丰富的语法糖
? 强类型
? 函数式编程
? 协程
……
因此,Kotlin也被戏称为Java好的第三方库。
本书详细介绍了Kotlin语言的各种特性,例如花了大量篇幅介绍各种类型的函数,贯彻本书始终的Lambda表达式,有别于Java的委托、泛型,灵活、简洁的DSL,常用的语法糖,相比线程更加轻量级的协程,参考RxJava实现的Flow,等等。
本书不仅介绍Kotlin的功能,还会对部分Kotlin特性进行源码解析,也会对各个特性进行深入的总结。
另外,本书带来了丰富的案例,涉及移动端、服务端甚至桌面端。它们都是笔者在大量使用 Kotlin之后的实践和心得,同时包含很多笔者封装的library,供读者参考、借鉴和使用。因此,本书主要面向移动端、服务端的读者。
本书编写的时间跨度有一点长,历经了Kotlin 1.3到当前的Kotlin 1.5。现在Kotlin已经变成笔者的主力编程语言。当然,Kotlin的研发团队也在不断更新,据说每隔6个月会发布一个新版本,有点类似Java发布新版本的节奏。笔者也会不断跟进Kotlin新版本的特性。
总之,本书尽量多地介绍Kotlin方方面面的特性,用丰富的例子来增强说服力。本书共18章,其中第10、13、14、15(部分内容)、17(部分内容)章是由易庞宙编写的,其余是由沈哲编写的。本书的资源在GitHub中,地址为https://github.com/fengzhizi715/Advance-Kotlin-Tutorials。
当然,在编写本书的过程中,Kotlin也在不断地更新、完善。另外,笔者才疏学浅,书中难免会有不当之处,欢迎读者批评指正,一起讨论Kotlin的方方面面。
后,写书是一个枯燥、漫长且耗费大量时间、精力的事情,感谢清华大学出版社的编辑、我的同事、家人对我的帮助,特别是我的太太一直在我身后默默地为家庭付出。
沈 哲
2021年6月
评论
还没有评论。