第1章 Kotlin应用开发初体验 1
1.1安装IntelliJ IDEA 1
1.2第一个Kotlin项目 2
1.2.1创建首个Kotlin文件 5
1.2.2运行Kotlin文件 7
1.3Kotlin REPL 8
1.4深入学习:为什么要用IntelliJ 10
1.5深入学习:面向JVM 10
1.6挑战练习:使用REPL研究Kotlin中的算数运算符 11
第2章 变量、常量和类型 12
2.1数据类型 12
2.2声明变量 12
2.3Kotlin的内置数据类型 14
2.4只读变量 15
2.5类型推断 17
2.6编译时常量 19
2.7查看Kotlin字节码 19
2.8深入学习:Kotlin中的Java基本数据类型 21
2.9挑战练习:定义hasSteed变量 22
2.10挑战练习:独角兽之角 22
2.11挑战练习:魔镜 23
第3章 条件语句 24
3.1if/else语句 24
3.1.1添加更多条件 27
3.1.2if/else嵌套语句 28
3.1.3更优雅的条件语句 29
3.2range 33
3.3when表达式 34
3.4string模板 36
3.5挑战练习:range研究 37
3.6挑战练习:优化玩家光环展示 38
3.7挑战练习:可配置的玩家状况报告格式 38
第4章 函数 40
4.1使用函数重构代码 40
4.2函数结构剖析 42
4.2.1函数头 42
4.2.2函数体 44
4.2.3函数作用域 45
4.3调用函数 46
4.4以函数重构代码 46
4.5自定义函数 48
4.6默认值参 49
4.7单表达式函数 50
4.8Unit函数 51
4.9具名函数参数 52
4.10深入学习:Nothing类型 53
4.11深入学习:Java中的文件级函数 54
4.12深入学习:函数重载 55
4.13深入学习:反引号中的函数名 56
4.14挑战练习:单表达式函数 57
4.15挑战练习:Fireball醉酒程度 57
4.16挑战练习:醉酒状态报告 57
第5章 匿名函数与函数类型 58
5.1匿名函数 58
5.1.1函数类型 59
5.1.2隐式返回 60
5.1.3函数参数 61
5.1.4it关键字 61
5.1.5多个参数 62
5.2类型推断 63
5.3定义参数是函数的函数 63
5.4函数内联 65
5.5函数引用 66
5.6函数类型作为返回类型 68
5.7深入学习:Kotlin中的lambda就是闭包 69
5.8深入学习:lambda与匿名内部类 69
第6章 null安全与异常 71
6.1可空性 71
6.2Kotlin的null类型 72
6.3编译时间与运行时间 73
6.4null安全 74
6.4.1选项一:安全调用操作符 75
6.4.2选项二:使用!!.操作符 76
6.4.3选项三:使用if判断null值情况 77
6.5异常 79
6.5.1抛出异常 80
6.5.2自定义异常 81
6.5.3处理异常 82
6.6先决条件函数 83
6.7null:真的一无是处吗 85
6.8深入学习:已检查异常与未检查异常 86
6.9深入学习:可空性该如何保证 86
第7章 字符串 88
7.1字符串截取 88
7.1.1substring 88
7.1.2split 90
7.2字符串操作 92
7.3字符串比较 93
7.4深入学习:Unicode 95
7.5深入学习:遍历字符 95
7.6挑战练习:改进toDragonSpeak函数 96
第8章 数 97
8.1数字类型 97
8.2整数 98
8.3小数数字 99
8.4字符串转数值类型 100
8.5Int类型转Double类型 101
8.6Double类型格式化 102
8.7Double类型转换为Int类型 103
8.8深入学习:位运算 104
8.9挑战练习:还剩多少酒 105
8.10挑战练习:解决负数余额问题 105
8.11挑战练习:龙币 105
第9章 标准库函数 106
9.1apply 106
9.2let 107
9.3run 108
9.4with 109
9.5also 109
9.6takeIf 110
9.7使用标准库函数 110
第10章 List与Set 112
10.1List 112
10.1.1获取列表元素 113
10.1.2更改列表内容 116
10.2遍历 119
10.3将文件数据读取到列表 122
10.4解构 124
10.5Set 124
10.5.1创建一个Set集合 124
10.5.2向Set集合中添加元素 125
10.6while循环 128
10.7break表达式 129
10.8集合转换 129
10.9深入学习:数组类型 130
10.10深入学习:只读与不可变 131
10.11挑战练习:美化酒水单 132
10.12挑战练习:进一步美化酒水单 132
第11章 Map 133
11.1创建一个Map 133
11.2读取Map集合的值 135
11.3向Map集合添加项 136
11.4修改Map集合值 137
11.5挑战练习:守卫小客栈 140
第12章 定义类 141
12.1定义一个类 141
12.2构造实例 141
12.3类函数 142
12.4可见性与封装 143
12.5类属性 144
12.5.1属性getter与setter 146
12.5.2属性可见性 148
12.5.3计算属性 149
12.6重构NyetHack 149
12.7使用包 156
12.8深入学习:细看var与val属性 157
12.9深入学习:防范竞态条件 160
12.10深入学习:私有包 161
第13章 初始化 162
13.1构造函数 162
13.1.1主构造函数 163
13.1.2在主构造函数里定义属性 164
13.1.3次构造函数 164
13.1.4默认参数 166
13.1.5命名参数 167
13.2初始化块 167
13.3属性初始化 168
13.4初始化顺序 170
13.5延迟初始化 172
13.5.1延迟初始化 172
13.5.2惰性初始化 173
13.6深入学习:初始化陷阱 174
13.7挑战练习:圣剑之谜 176
第14章 继承 178
14.1定义Room类 178
14.2创建子类 179
14.3类型检测 184
14.4Kotlin类层次 186
14.4.1类型转换 187
14.4.2智能类型转换 188
14.5深入学习:Any 189
第15章 对象 190
15.1object关键字 190
15.1.1对象声明 190
15.1.2对象表达式 195
15.1.3伴生对象 195
15.2嵌套类 196
15.3数据类 199
15.3.1toString 200
15.3.2equals 200
15.3.3copy 200
15.3.4解构声明 201
15.4枚举类 202
15.5运算符重载 203
15.6探索NyetHack游戏世界 205
15.7深入学习:定义结构比较 208
15.8深入学习:代数数据类型 210
15.9挑战练习:“quit”命令 211
15.10挑战练习:魔力地图 212
15.11挑战练习:摇铃 212
第16章 接口与抽象类 213
16.1定义接口 213
16.2实现接口 214
16.3默认实现 216
16.4抽象类 217
16.5在NyetHack游戏里打怪 219
第17章 泛型 223
17.1定义泛型类 223
17.2泛型函数 224
17.3多泛型参数 225
17.4泛型约束 227
17.5vararg关键字与get函数 228
17.6in与out 230
17.7深入学习:reified关键字 234
第18章 扩展 236
18.1定义扩展函数 236
18.2泛型扩展函数 237
18.3扩展属性 239
18.4可空类扩展 240
18.5扩展实现揭秘 241
18.6用扩展封装代码 241
18.7定义扩展文件 243
18.8重命名扩展 245
18.9Kotlin标准库中的扩展 245
18.10深人学习:带接收者的函数字面量 246
18.11挑战练习:toDragonSpeak扩展 247
18.12挑战练习:frame扩展 247
第19章 函数式编程基础 248
19.1函数类别 248
19.1.1变换 248
19.1.2过滤 250
19.1.3合并 251
19.2为什么要学习函数式编程 252
19.3序列 253
19.4深入学习:评估代码性能 254
19.5深入学习:Arrow.kt 255
19.6挑战练习:Map值反转 255
19.7挑战练习:应用函数式编程 256
19.8挑战练习:滑窗算法 257
第20章 Kotlin与Java互操作 258
20.1与Java类互操作 258
20.2互操作性与可空性 259
20.3类型映射 262
20.4getter和setter方法与互操作性 263
20.5类之外 265
20.6异常与互操作性 272
20.7Java中的函数类型 275
第21章 用Kotlin开发首个Android应用 277
21.1Android Studio 277
21.1.1Gradle配置 281
21.1.2项目组织 283
21.2定义UI 283
21.3用模拟器运行应用 286
21.4生成角色 287
21.5Activity类 288
21.6实例化视图 289
21.7Kotlin Android扩展 291
21.8设置单击事件监听器 293
21.9保存实例状态 294
21.10使用扩展重构代码 296
21.11深入学习:Android KTX与Anko库 298
第22章 Kotlin协程简介 300
22.1解析角色数据 300
22.2获取动态数据 302
22.3Android主线程 305
22.4启用协程 305
22.5使用async指定协程 305
22.6launch与async/await 307
22.7挂起函数 307
22.8挑战练习:动态数据 308
22.9挑战练习:最小力量值 308
第23章 编后语 309
23.1前方的路 309
23.2插个广告 309
23.3致谢 309
附录A 补充挑战练习 310
术语表 316