图书目录

目    录

第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