第一部分 Kotlin入门与基础 1
第1章 Kotlin简介 1
1.1 Kotlin发展史 1
1.2 面向对象编程概述 3
1.2.1 面向过程编程 3
1.2.2 面向对象编程 4
1.3 Java虚拟机 5
1.3.1 JVM语系生态 5
1.3.2 Java虚拟机概述 7
1.3.3 Kotlin应用程序运行过程 7
1.4 为什么使用Kotlin 8
1.5 Kotlin与Java的比较 11
1.6 小结 12
第2章 Kotlin初体验 13
2.1 Kotlin在线运行 13
2.2 Kotlin 1.1 特性 15
2.2.1 JavaScript全面支持 15
2.2.2 JVM新特性 16
2.2.3 协程 17
2.2.4 标准库 19
2.3 Kotlin 1.2 新特性 20
2.3.1 多平台支持 21
2.3.2 多平台环境搭建 21
2.3.3 特定平台声明 24
2.3.4 标准库支持 25
2.3.5 JVM特性 27
2.3.6 JavaScript特性支持 28
2.4 小结 29
第3章 Kotlin快速入门 30
3.1 在Mac上搭建Kotlin开发环境 30
3.1.1 安装与配置JDK环境 30
3.1.2 安装与配置IDE 33
3.2 Kotlin开发IDE介绍 36
3.2.1 IntelliJ IDEA开发环境 36
3.2.2 Android Studio集成开发环境 38
3.3 Kotlin的编译与运行 42
3.3.1 命令行方式编译运行Kotlin 42
3.3.2 运行Kotlin REPL 44
3.3.3 在浏览器中运行Kotlin 45
3.3.4 在Node.js中运行Kotlin 47
3.4 Kotlin构建方式 48
3.4.1 使用Gradle方式构建Kotlin 48
3.4.2 使用Maven方式构建Kotlin 50
3.4.3 使用Ant方式构建Kotlin 51
3.4.4 Kotlin与OSGi 52
3.4.5 Kotlin与Kapt 53
3.5 编译器插件 55
3.5.1 全开放编译插件 55
3.5.2 无参编译器插件 56
3.6 小结 58
第二部分 Kotlin语法 59
第4章 Kotlin语法基础 59
4.1 Kotlin编程风格 59
4.2 变量与属性 61
4.2.1 变量声明 61
4.2.2 getter和setter 63
4.2.3 访问权限 65
4.3 基本数据类型 66
4.3.1 数值类型 66
4.3.2 字符类型 68
4.3.3 布尔类型 69
4.3.4 数组类型 69
4.3.5 字符串 70
4.4 包声明与使用 72
4.5 流程控制语句 75
4.5.1 if条件语句 75
4.5.2 when语句 76
4.5.3 for循环 78
4.5.4 while循环 79
4.5.5 返回与跳转 79
4.6 Kotlin运算符 80
4.6.1 赋值运算符 80
4.6.2 算数运算符 81
4.6.3 关系运算符 81
4.6.4 逻辑运算符 82
4.6.5 区间运算符 82
4.6.6 运算符优先级 83
4.7 运算符重载 84
4.7.1 一元运算符 85
4.7.2 二元运算符 86
4.7.3 位运算符 88
4.8 Kotlin操作符 88
4.8.1 冒号操作符 88
4.8.2 @操作符 89
4.8.3 $操作符 90
4.8.4 安全转换操作符 90
4.8.5 类型判断操作符 90
4.9 Kotlin动态类型 91
4.10 Kotlin空安全 92
4.10.1 可空类型与不可空类型 92
4.10.2 判空操作符 93
4.10.3 Elvis操作符 94
4.10.4 强校验操作符 94
4.10.5 安全的类型转换 95
4.10.6 可空类型集合 95
4.11 异常处理 95
4.11.1 异常类 95
4.11.2 自定义异常 96
4.11.3 try表达式 97
4.11.4 throw表达式 97
4.11.5 受检异常 97
4.12 小结 98
第5章 类与接口 99
5.1 类 99
5.1.1 类的声明 99
5.1.2 构造函数 101
5.1.3 类的实例 102
5.2 继承 103
5.3 抽象类 106
5.4 接口 108
5.5 小结 110
第6章 扩展函数与属性 111
6.1 枚举 111
6.1.1 基本用法 111
6.1.2 枚举类扩展 112
6.2 扩展 114
6.2.1 扩展的动机 114
6.2.2 扩展原生函数 114
6.2.3 静态解析 115
6.2.4 扩展属性 116
6.2.5 扩展伴生对象 117
6.2.6 扩展的作用域 117
6.2.7 类中声明扩展 118
6.3 this表达式 120
6.4 小结 121
第7章 数据类与密封类 122
7.1 数据类 122
7.1.1 对象复制 123
7.1.2 序列化 124
7.1.3 成员解构 125
7.2 密封类 127
7.3 小结 128
第8章 集合与泛型 129
8.1 集合 129
8.1.1 集 129
8.1.2 列表 130
8.1.3 映射 132
8.2 泛型 133
8.2.1 泛型基础 133
8.2.2 型变 134
8.2.3 声明处型变 135
8.2.4 类型投影 136
8.2.5 星号投影 138
8.2.6 泛型函数 138
8.2.7 泛型约束 139
8.3 小结 139
第9章 对象与委托 140
9.1 对象 140
9.1.1 对象表达式 140
9.1.2 对象声明 142
9.1.3 伴生对象 143
9.2 委托 144
9.2.1 类委托 144
9.2.2 委托属性 145
9.3 标准委托 146
9.3.1 延迟属性 146
9.3.2 可观察属性 147
9.3.3 Map委托 148
9.3.4 Not Null 149
9.3.5 局部委托属性 150
9.3.6 提供委托 151
9.4 小结 152
第10章 反射与注解 153
10.1 反射 153
10.1.1 类引用 154
10.1.2 类成员引用 154
10.1.3 函数引用 155
10.1.4 属性引用 156
10.1.5 构造函数引用 157
10.1.6 KClass反射 158
10.1.7 对象序列化 161
10.2 注解 162
10.2.1 注解声明 162
10.2.2 注解使用 163
10.2.3 注解类的构造函数 165
10.2.4 注解使用场景目标 166
10.2.5 与Java注解互调 167
10.2.6 注解分类 168
10.2.7 注解的生命周期 169
10.3 小结 169
第11章 函数与Lambda表达式 170
11.1 函数 170
11.1.1 函数基本用法 170
11.1.2 中缀表示法 171
11.1.3 函数参数 171
11.1.4 函数作用域 173
11.1.5 函数返回值 174
11.1.6 尾递归函数 175
11.2 高阶函数 175
11.2.1 高阶函数基本用法 175
11.2.2 标准高阶函数 177
11.3 内联函数 179
11.3.1 内联Lambda表达式 179
11.3.2 内联函数声明 180
11.3.3 非局部返回 181
11.3.4 实例化类型参数 182
11.3.5 内联属性 183
11.4 Lambda表达式与匿名函数 183
11.4.1 Lambda表达式语法 184
11.4.2 函数类型 185
11.4.3 匿名函数 185
11.4.4 闭包 186
11.4.5 函数显式声明 186
11.5 小结 187
第12章 协程 188
12.1 协程简介 188
12.1.1 协程与线程 188
12.1.2 使用协程的好处 189
12.2 协程开发环境 190
12.2.1 Gradle构建方式 190
12.2.2 Maven构建方式 191
12.3 协程基础 192
12.3.1 launch函数 192
12.3.2 共享线程池 193
12.3.3 阻塞与挂起 193
12.3.4 runBlocking函数 194
12.3.5 协程取消 195
12.3.6 协程超时 195
12.3.7 标准API 196
12.4 挂起函数 197
12.4.1 默认顺序执行 198
12.4.2 异步并发执行 198
12.4.3 异步样式函数 200
12.5 协程上下文与调度器 201
12.5.1 协程调度与线程 201
12.5.2 非限制与限制协程 202
12.5.3 协程与线程调试 203
12.5.4 协程中的子协程 203
12.6 通道 204
12.6.1 通道基础 204
12.6.2 通道的关闭与迭代 205
12.6.3 通道生产者 206
12.7 管道 206
12.7.1 管道生产与消费 206
12.7.2 管道与质数 207
12.7.3 多接收者协程 208
12.7.4 通道缓存 209
12.8 小结 210
第13章 I/O操作与多线程 211
13.1 Kotlin流层次 211
13.1.1 字节输入流 212
13.1.2 字节输出流 213
13.1.3 字符输入流 214
13.1.4 字符输出流 215
13.1.5 字符流与字节流转换 216
13.2 文件I/O操作 216
13.2.1 文件读取 217
13.2.2 文件写入 217
13.2.3 文件遍历 218
13.3 网络I/O操作 219
13.4 多线程 219
13.4.1 线程创建 220
13.4.2 线程同步 220
13.5 小结 221
第14章 Kotlin DSL 222
14.1 DSL简介 222
14.1.1 DSL的设计与实现 222
14.1.2 DSL分类 223
14.2 DSL语义模型 223
14.2.1 依赖网络 224
14.2.2 产生式规则系统 224
14.2.3 状态机 224
14.3 Kotlin的DSL特性 225
14.4 使用kotlinx.html创建DSL 226
14.4.1 Maven构建方式 227
14.4.2 Gradle构建方式 228
14.4.3 kotlinx.html实例 229
14.5 Android Gradle指南 233
14.5.1 链式命令 233
14.5.2 委托 234
14.6 使用Kotlin与Anko进行Android开发 235
14.6.1 Anko简介 235
14.6.2 Anko核心组件与工具 236
14.6.3 Anko使用实例 238
14.7 小结 242
第15章 Kotlin互操作 243
15.1 Kotlin与Java互操作 243
15.1.1 在Kotlin中调用Java 243
15.1.2 在Java中调用Kotlin 251
15.1.3 JSR-305支持 257
15.2 Kotlin与JavaScript互操作 261
15.2.1 在Kotlin中调用JavaScript 261
15.2.2 在JavaScript中调用Kotlin 264
15.2.3 JavaScript模块 266
15.2.4 JavaScript反射 269
15.2.5 JavaScript DCE 270
15.3 小结 271
第16章 Kotlin Native开发 272
16.1 Kotlin Native 272
16.1.1 Kotlin Native简介 272
16.1.2 Kotlin Native编译器 273
16.1.3 编译器konan 274
16.2 Kotlin Native实例 275
16.2.1 构建Kotlin Native项目 275
16.2.2 添加konan插件配置 276
16.2.3 编写源代码 277
16.2.4 添加konanInterop与konanArtifacts配置 278
16.2.5 编译与执行 279
16.2.6 用命令行方式编译Kotlin Native 280
16.3 使用Kotlin Native开发iOS应用 281
16.3.1 创建Kotlin Native项目 281
16.3.2 Kotlin Native测试 284
16.4 小结 286
第三部分 Kotlin项目实例 287
第17章 使用Kotlin与Spring Boot开发服务端 287
17.1 Spring Boot环境搭建 287
17.1.1 Spring Boot简介 287
17.1.2 创建Spring Boot应用程序 288
17.1.3 启动Spring Boot应用程序 292
17.1.4 应用测试 293
17.1.5 properties配置文件 296
17.2 Spring Boot之Thymeleaf模板 298
17.3 使用Swagger构建RESTful API 301
17.4 Spring Boot通过MyBatis整合MySQL数据库 304
17.5 Spring Boot整合Redis数据库 308
17.5.1 Redis简介 308
17.5.2 Spring Boot整合Redis 310
17.6 Spring Boot整合Elasticsearch 313
17.6.1 Elasticsearch简介 313
17.6.2 Spring Boot整合Elasticsearch 315
17.7 Spring Boot集成RabbitMQ 319
17.7.1 RabbitMQ简介 319
17.7.2 Spring Boot集成RabbitMQ 321
17.8 Spring Boot热部署与日志管理 323
17.9 Spring Framework 5.0对Kotlin的支持 326
17.9.1 函数式Bean注册方式 326
17.9.2 使用Kotlin调用Spring Web的功能性API 326
17.9.3 RestTemplate与函数式API扩展 327
17.9.4 Reactor的Kotlin扩展 327
17.9.5 基于模板的Kotlin脚本 327
17.10 小结 328
第18章 使用Kotlin开发Android视频应用 329
18.1 项目概述 329
18.2 浅谈Android开发架构模式 329
18.2.1 MVC 331
18.2.2 MVP 331
18.2.3 MVVM 332
18.3 项目准备 333
18.3.1 新建Android项目 333
18.3.2 添加项目库依赖 334
18.3.3 编写主页面 335
18.3.4 Android 6.0权限适配 338
18.3.5 GSYVideoPlayer播放器简介 340
18.4 项目开发 341
18.4.1 基础类封装 341
18.4.2 Retrofit封装 344
18.4.3 自定义状态控制控件 345
18.4.4 首页模块开发 348
18.4.5 视频详情页面开发 352
18.4.6 搜索功能的实现 355
18.5 小结 357