[套装书]Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序+Kotlin核心编程(2册)

作者
文卡特·苏布拉马尼亚姆 水滴技术团队
丛书名
华章程序员书库
出版社
机械工业出版社
ISBN
9782106021451
简要
简介
内容简介书籍计算机书籍 ---------------------------8081117 - Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序--------------------------- 本书面向程序员、开发主管、架构师和技术经理。假定读者熟悉编程的基础知识,同时也假定读者对Java和JDK有一定的了解。第I部分主要介绍使用Kotlin编写脚本。第II部分是关于面向对象的编程。在第III部分中,你将学习如何使用该语言的函数风格的功能。第IV部分将把目前为止所学的知识结合起来,使你的代码更加流畅,并教会你如何创建内部领域特定语言(DSL)。在第V部分中,你将了解新的协程和异步编程。第VI部分涉及Java的互操作、测试、使用带有Spring的Kotlin,以及使用Kotlin编写Android应用程序。 ---------------------------8058700 - Kotlin核心编程--------------------------- 本书不是一本简单介绍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响应式框架和编程等内容。
目录
[套装书具体书目]
8058700 - Kotlin核心编程 - 9787111624318 - 机械工业出版社 - 定价 89
8081117 - Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序 - 9787111682752 - 机械工业出版社 - 定价 129



---------------------------8081117 - Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序---------------------------


本书赞誉

前言
致谢
第1章 你好Kotlin1
1.1 爱上Kotlin的理由2
1.1.1 多范式编程3
1.1.2 具有类型推断的静态类型4
1.2 为什么选择Kotlin5
1.3 带Kotlin去兜兜风5
1.3.1 安装Kotlin SDK6
1.3.2 验证安装6
1.4 编译成字节码并运行7
1.4.1 在命令行上运行7
1.4.2 在IDE中运行8
1.4.3 使用REPL进行实验8
1.4.4 作为脚本运行9
1.5 编译成其他目标11
1.6 选择哪个选项11
1.7 本章小结12
第一部分 使用Kotlin编写脚本
第2章 从Java角度了解Kotlin的基本知识14
2.1 减少输入15
2.1.1 分号是可选的15
2.1.2 变量类型规范是可选的15
2.1.3 类和函数是可选的17
2.1.4 try-catch是可选的18
2.2 合理的警告19
2.3 选择val而不是var20
2.4 改进的相等性检查21
2.5 字符串模板23
2.6 原始字符串24
2.6.1 没有转义24
2.6.2 多行字符串24
2.7 更多的表达式,更少的语句26
2.8 本章小结28
第3章 使用函数29
3.1 创建函数30
3.1.1 KISS函数30
3.1.2 返回类型和类型推断30
3.1.3 所有的函数都是表达式31
3.1.4 定义参数32
3.1.5 带有块体的函数33
3.2 默认参数和命名参数34
3.2.1 演化带有默认参数的函数34
3.2.2 使用命名参数提高可读性35
3.3 vararg和spread37
3.3.1 可变数量的实参37
3.3.2 spread运算符38
3.4 解构39
3.5 本章小结40
第4章 外部迭代和参数匹配42
4.1 范围与迭代43
4.1.1 范围类43
4.1.2 正向迭代43
4.1.3 反向迭代44
4.1.4 跳过范围内的值44
4.2 遍历数组和列表45
4.3 何时应该使用when47
4.3.1 when用作表达式47
4.3.2 when用作语句49
4.3.3 when和变量的作用域49
4.4 本章小结50
第5章 使用集合51
5.1 集合的类型51
5.1.1 Kotlin所添加的便利方法52
5.1.2 视图53
5.2 使用Pair和Triple53
5.3 对象和基元数组55
5.4 使用列表56
5.5 使用集合59
5.6 使用映射59
5.7 本章小结61
第6章 使用类型安全性解决问题63
6.1 Any和Nothing类64
6.1.1 Any是基类64
6.1.2 Nothing比void更深入65
6.2 可空的引用65
6.2.1 null是件不好的事66
6.2.2 使用可空类型67
6.2.3 安全调用运算符69
6.2.4 Elvis运算符69
6.2.5 不要使用不安全的断言运算符70
6.2.6 使用when71
6.3 类型检查和转换72
6.3.1 类型检查72
6.3.2 使用is72
6.3.3 智能转换73
6.3.4 使用带有when的类型检查和智能转换75
6.4 显式类型转换75
6.5 泛型:参数类型的变化和约束77
6.5.1 类型不变性77
6.5.2 使用协变79
6.5.3 使用逆变81
6.5.4 使用where的参数类型约束82
6.5.5 星投影83
6.6 具体化的类型参数84
6.7 本章小结86
第二部分 面向对象的Kotlin
第7章 对象和类88
7.1 对象和单例88
7.1.1 带有对象表达式的匿名对象89
7.1.2 带有对象声明的单例91
7.1.3 顶级函数与单例92
7.2 创建类93
7.2.1 最小的类94
7.2.2 只读属性94
7.2.3 创建实例94
7.2.4 读写属性95
7.2.5 底层探秘—字段和属性95
7.3 伴生对象和类成员102
7.3.1 类级别成员102
7.3.2 访问同伴103
7.3.3 Companion作为Factory103
7.3.4 不是非常静态的104
7.4 创建泛型类105
7.5 数据类106
7.6 本章小结108
第8章 类层次结构和继承110
8.1 创建接口和抽象类110
8.1.1 创建接口111
8.1.2 创建抽象类113
8.1.3 是接口还是抽象类113
8.2 嵌套类和内部类114
8.3 继承116
8.4 Sealed类119
8.5 创建和使用枚举120
8.6 本章小结122
第9章 通过委托进行扩展124
9.1 何时选择委托而不是继承125
9.2 使用委托进行设计126
9.2.1 一个设计问题126
9.2.2 继承的错误指向127
9.2.3 委托—艰难的方式128
9.2.4 使用Kotlin的by来进行委托129
9.3 委托给一个参数130
9.4 处理方法冲突131
9.5 Kotlin委托的注意事项133
9.6 委托变量和属性135
9.6.1 委托变量135
9.6.2 委托属性137
9.7 内置的标准委托139
9.7.1 有点儿懒惰也没关系140
9.7.2 Observable委托141
9.7.3 行使你的可否决权利142
9.8 本章小结143
第三部分 函数式Kotlin
第10章 使用lambda进行函数式编程146
10.1 函数式风格146
10.1.1 什么是函数式风格147
10.1.2 为什么以及何时使用函数式风格148
10.2 lambda表达式149
10.2.1 lambda的结构149
10.2.2 传递lambda150
10.2.3 使用隐式参数151
10.2.4 接收lambda151
10.2.5 用lambda作为最后一个参数151
10.2.6 使用函数引用152
10.2.7 函数返回函数154
10.3 lambda和匿名函数155
10.4 闭包和词法作用域157
10.5 非局部和带标签的return158
10.5.1 默认情况下不允许使用return 158
10.5.2 带标签的return159
10.5.3 非局部return161
10.6 带有lambda的内联函数163
10.6.1 默认情况下没有内联优化163
10.6.2 内联优化164
10.6.3 对参数精心选择noinline 165
10.6.4 内联lambda中允许非局部return166
10.6.5 crossinline参数167
10.6.6 inline和return的良好实践168
10.7 本章小结169
第11章 内部迭代和延迟计算170
11.1 外部迭代器与内部迭代器171
11.2 内部迭代器172
11.2.1 filter、map和reduce172
11.2.2 得到第一个和最后一个174
11.2.3 flatten和flatMap175
11.2.4 排序177
11.2.5 将对象进行分组177
11.3 延迟计算序列178
11.3.1 使用序列提高性能179
11.3.2 无限序列181
11.4 本章小结183
第四部分 优雅且高效的Kotlin
第12章 Kotlin的流畅性186
12.1 重载运算符187
12.2 使用扩展函数和属性进行注入190
12.2.1 使用扩展函数注入方法190
12.2.2 使用扩展函数注入运算符191
12.2.3 使用扩展属性注入属性192
12.2.4 注入第三方类192
12.2.5 注入静态方法195
12.2.6 从类内注入195
12.3 扩展函数197
12.4 带中缀的函数流畅性198
12.5 带Any对象的流畅性199
12.5.1 四种方法的行为200
12.5.2 来自冗长和混乱的代码201
12.5.3 使用apply删除重复的引用202
12.5.4 使用run获得结果203
12.5.5 使用let将对象作为参数传递203
12.5.6 使用also将void函数链接起来205
12.6 隐式接收方206
12.6.1 传递一个接收方206
12.6.2 带接收方的多个作用域207
12.7 本章小结209
第13章 创建内部DSL210
13.1 DSL的类型和特征211
13.1.1 外部DSL与内部DSL211
13.1.2 语境驱动和流畅211
13.2 用于内部DSL的Kotlin211
13.2.1 分号可选212
13.2.2 点和圆括号不与中缀在一起212
13.2.3 使用扩展函数获得特定的域212
13.2.4 传递lambda不需要圆括号213
13.2.5 隐式接收方影响DSL的创建213
13.2.6 还有一些特性可以帮助DSL214
13.3 构建流畅性方面的挑战214
13.3.1 使用扩展函数215
13.3.2 使用接收方和中缀216
13.4 类型安全构建器220
13.4.1 HTML构建器220
13.4.2 XML构建器222
13.5 使用作用域控制来缩小访问范围225
13.6 本章小结227
第14章 编写递归和记忆228
14.1 递归的威力和危险228
14.2 尾调用优化230
14.3 记忆232
14.3.1 重复计算233
14.3.2 记忆—Kotlin中的Groovy方法234
14.3.3 记忆作为委托235
14.4 将记忆应用于动态规划237
14.5 本章小结238
第五部分 编写异步应用程序
第15章 探索协程242
15.1 协程和并发242
15.1.1 并行与并发243
15.1.2 协程作为协作函数243
15.2 使用协程并发运行244
15.2.1 从顺序执行开始244
15.2.2 创建一个协程245
15.2.3 启动一个任务246
15.2.4 与挂起点交错调用247
15.3 协程上下文和线程249
15.3.1 显式设置上下文249
15.3.2 在自定义池中运行250
15.3.3 在挂起点后切换线程251
15.3.4 修改CoroutineContext253
15.4 调试协程254
15.4.1 async 和await255
15.4.2 看一眼延续256
15.5 创建无限序列258
15.5.1 使用序列258
15.5.2 使用iterator函数259
15.6 本章小结261
第16章 异步编程262
16.1 非阻塞异步编程262
16.1.1 按顺序开始262
16.1.2 进行异步264
16.2 异常处理266
16.2.1 启动和异常266
16.2.2 异步和异常268
16.3 取消和超时270
16.3.1 取消协程270
16.3.2 请勿打扰273
16.3.3 双向取消274
16.3.4 监督作业275
16.3.5 编程时使用超时276
16.4 本章小结277
第六部分 互操作和测试
第17章 将Java与Kotlin混合使用280
17.1 联合编译280
17.2 从Kotlin调用Java283
17.3 从Java调用Kotlin286
17.3.1 使用Java中的重载运算符287
17.3.2 创建静态方法288
17.3.3 传递lambda289
17.3.4 添加throws子句290
17.3.5 使用带默认参数的函数292
17.3.6 访问顶级函数293
17.3.7 更多注释294
17.4 本章小结294
第18章 使用Kotlin进行单元测试296
18.1 被测试的代码296
18.2 获取项目文件297
18.2.1 设置Gradle298
18.2.2 设置Maven300
18.3 从Canary测试开始300
18.4 编写经验测试301
18.5 编写数据驱动的测试304
18.6 模拟依赖项305
18.6.1 创建交互测试306
18.6.2 测试解析数据308
18.7 测试顶级函数310
18.8 测试协程和异步调用313
18.9 与服务集成316
18.10 查看代码覆盖率317
18.11 将应用程序用于驱动318
18.12 本章小结319
第19章 使用Kotlin编写Spring应用程序320
19.1 创建一个Starter项目320
19.2 创建一个控制器322
19.3 创建一个实体类324
19.4 创建一个存储库接口325
19.5 创建一个服务326
19.6 将服务与控制器集成327
19.7 继续实践329
19.8 本章小结330
第20章 使用Kotlin编写Android应用程序331
20.1 创建一个项目331
20.2 定义域对象333
20.3 创建布局335
20.4 实施活动337
20.5 更新RecyclerView341
20.6 查看应用程序的运行情况343
20.7 本章小结344
附录1 转换为JavaScript346
附录2 Kotlin/Native350
附录3 Kotlin到WebAssembly353
参考文献357



---------------------------8058700 - Kotlin核心编程---------------------------


前言
热身篇 Kotlin基础
第1章 认识Kotlin2
1.1 Java的发展2
1.1.1 Java 8的探索3
1.1.2 Java未来的样子3
1.2 Scala的百宝箱3
1.2.1 学术和工业的平衡4
1.2.2 复合但不复杂4
1.2.3 简单却不容易5
1.3 Kotlin—改良的Java5
1.3.1 Kotlin的实用主义6
1.3.2 更好的Java6
1.3.3 强大的生态8
1.4 本章小结8
第2章 基础语法10
2.1 不一样的类型声明10
2.1.1 增强的类型推导11
2.1.2 声明函数返回值类型11
2.2 val和var的使用规则13
2.2.1 val的含义:引用不可变13
2.2.2 优先使用val来避免副作用14
2.2.3 var的适用场景15
2.3 高阶函数和Lambda16
2.3.1 抽象和高阶函数17
2.3.2 实例:函数作为参数的需求17
2.3.3 函数的类型19
2.3.4 方法和成员引用21
2.3.5 匿名函数22
2.3.6 Lambda是语法糖22
2.3.7 函数、Lambda和闭包25
2.3.8 “柯里化”风格、扩展函数26
2.4 面向表达式编程29
2.4.1 表达式比语句更安全30
2.4.2 Unit类型:让函数调用皆为表达式32
2.4.3 复合表达式:更好的表达力33
2.4.4 枚举类和when表达式34
2.4.5 for循环和范围表达式37
2.4.6 中缀表达式39
2.5 字符串的定义和操作41
2.5.1 定义原生字符串41
2.5.2 字符串模板42
2.5.3 字符串判等43
2.6 本章小结43
下水篇 Kotlin核心
第3章 面向对象46
3.1 类和构造方法46
3.1.1 Kotlin中的类及接口46
3.1.2 更简洁地构造类的对象49
3.1.3 主从构造方法55
3.2 不同的访问控制原则56
3.2.1 限制修饰符57
3.2.2 可见性修饰符61
3.3 解决多继承问题64
3.3.1 骡子的多继承困惑64
3.3.2 接口实现多继承65
3.3.3 内部类解决多继承问题的方案67
3.3.4 使用委托代替多继承69
3.4 真正的数据类71
3.4.1 烦琐的JavaBean 71
3.4.2 用data class创建数据类 73
3.4.3 copy、componentN与解构75
3.4.4 数据类的约定与使用78
3.5 从static到object79
3.5.1 什么是伴生对象79
3.5.2 天生的单例:object81
3.5.3 object表达式82
3.6 本章小结84
第4章 代数数据类型和模式匹配85
4.1 代数数据类型85
4.1.1 从代数到类型86
4.1.2 计数87
4.1.3 积类型87
4.1.4 和类型与密封类88
4.1.5 构造代数数据类型89
4.2 模式匹配90
4.2.1 何为模式91
4.2.2 常见的模式92
4.2.3 处理嵌套表达式93
4.2.4 通过Scala找点灵感95
4.2.5 用when力挽狂澜97
4.3 增强 Kotlin 的模式匹配99
4.3.1 类型测试/类型转换99
4.3.2 面向对象的分解100
4.3.3 访问者设计模式102
4.3.4 总结104
4.4 用代数数据类型来抽象业务105
4.4.1 从一个实际需求入手105
4.4.2 糟糕的设计105
4.4.3 利用ADT106
4.4.4 更高层次的抽象108
4.5 本章总结110
第5章 类型系统112
5.1 null引用:10亿美元的错误112
5.1.1 null做了哪些恶112
5.1.2 如何解决NPE问题114
5.2 可空类型115
5.2.1 Java 8中的Optional115
5.2.2 Kotlin的可空类型118
5.2.3 类型检查121
5.2.4 类型智能转换122
5.3 比Java更面向对象的设计124
5.3.1 Any:非空类型的根类型124
5.3.2 Any:所有类型的根类型127
5.3.3 Nothing与Nothing128
5.3.4 自动装箱与拆箱128
5.3.5 “新”的数组类型129
5.4 泛型:让类型更加安全130
5.4.1 泛型:类型安全的利刃130
5.4.2 如何在Kotlin中使用泛型131
5.4.3 类型约束:设定类型上界133
5.5 泛型的背后:类型擦除135
5.5.1 Java为什么无法声明一个泛型数组135
5.5.2 向后兼容的罪136
5.5.3 类型擦除的矛盾138
5.5.4 使用内联函数获取泛型139
5.6 打破泛型不变140
5.6.1 为什么List不能赋值给List140
5.6.2 一个支持协变的List141
5.6.3 一个支持逆变的Comparator143
5.6.4 协变和逆变144
5.7 本章小结147
第6章 Lambda和集合148
6.1 Lambda简化表达148
6.1.1 调用Java的函数式接口148
6.1.2 带接收者的Lambda149
6.1.3 with和apply150
6.2 集合的高阶函数API151
6.2.1 以简驭繁:map151
6.2.2 对集合进行筛选:filter、count152
6.2.3 别样的求和方式:sumBy、sum、fold、reduce154
6.2.4 根据学生性别进行分组:groupBy156
6.2.5 扁平化—处理嵌套集合:flatMap、flatten157
6.3 集合库的设计159
6.3.1 集合的继承关系159
6.3.2 可变集合与只读集合160
6.4 惰性集合163
6.4.1 通过序列提高效率163
6.4.2 序列的操作方式164
6.4.3 序列可以是无限的166
6.4.4 序列与Java 8 Stream对比166
6.5 内联函数167
6.5.1 优化Lambda开销168
6.5.2 内联函数具体语法169
6.5.3 noinline:避免参数被内联171
6.5.4 非局部返回172
6.5.5 crossinline174
6.5.6 具体化参数类型174
6.6 本章小结175
第7章 多态和扩展176
7.1 多态的不同方式176
7.1.1 子类型多态176
7.1.2 参数多态177
7.1.3 对第三方类进行扩展178
7.1.4 特设多态与运算符重载178
7.2 扩展:为别的类添加方法、属性179
7.2.1 扩展与开放封闭原则179
7.2.2 使用扩展函数、属性180
7.2.3 扩展的特殊情况183
7.2.4 标准库中的扩展函数:run、let、also、takeIf186
7.3 Android中的扩展应用188
7.3.1 优化Snackbar188
7.3.2 用扩展函数封装Utils189
7.3.3 解决烦人的findViewById190
7.4 扩展不是万能的193
7.4.1 调度方式对扩展函数的影响193
7.4.2 被滥用的扩展函数196
7.5 本章小结197
第8章 元编程198
8.1 程序和数据199
8.1.1 什么是元编程199
8.1.2 常见的元编程技术201
8.2 Kotlin的反射202
8.2.1 Kotlin和Java反射202
8.2.2 Kotlin的KClass205
8.2.3 Kotlin的KCallable206
8.2.4 获取参数信息208
8.3 Kotlin的注解210
8.3.1 无处不在的注解211
8.3.2 精确控制注解的位置212
8.3.3 获取注解信息213
8.4 本章小结216
潜入篇 Kotlin探索
第9章 设计模式218
9.1 创建型模式218
9.1.1 伴生对象增强工厂模式219
9.1.2 内联函数简化抽象工厂222
9.1.3 用具名可选参数而不是构建者模式224
9.2 行为型模式228
9.2.1 Kotlin中的观察者模式228
9.2.2 高阶函数简化策略模式、模板方法模式231
9.2.3 运算符重载和迭代器模式235
9.2.4 用偏函数实现责任链模式237
9.2.5 ADT实现状态模式241
9.3 结构型模式244
9.3.1 装饰者模式:用类委托减少样板代码245
9.3.2 通过扩展代替装饰者246
9.4 本章小结248
第10章 函数式编程249
10.1 函数式编程的特征249
10.1.1 函数式语言之争250
10.1.2 纯函数与引用透明性251
10.1.3 代换模型与惰性求值253
10.2 实现Typeclass254
10.2.1 高阶类型:用类型构造新类型255
10.2.2 高阶类型和Typeclass256
10.2.3 用扩展方法实现Typeclass257
10.2.4 Typeclass设计常见功能258
10.3 函数式通用结构设计262
10.3.1 Monoid262
10.3.2 Monad264
10.3.3 Monad组合副作用269
10.4 类型代替异常处理错误271
10.4.1 Option与OptionT272
10.4.2 Either与EitherT276
10.5 本章小结279
第11章 异步和并发281
11.1 同步到异步281
11.1.1 同步与阻塞的代价281
11.1.2 利用异步非阻塞来提高效率284
11.1.3 回调地狱284
11.2 Kotlin的Coroutine286
11.2.1 多线程一定优于单线程吗287
11.2.2 协程:一个更轻量级的“线程”287
11.2.3 合理地使用协程288
11.2.4 用同步方式写异步代码290
11.3 共享资源控制293
11.3.1 锁模式293
11.3.2 Actor:有状态的并行计算单元296
11.4 CQRS架构302
11.4.1 Event Sourcing事件溯源—记录对象操作轨迹302
11.4.2 Kotlin with Akka Persistence-Actor304
11.5 本章小结310
遨游篇 Kotlin实战
第12章 基于Kotlin的Android架构314
12.1 架构方式的演变314
12.1.1 经典的 MVC 问题315
12.1.2 MVP316
12.1.3 MVVM320
12.2 单向数据流模型327
12.2.1 Redux327
12.2.2 单向数据流的优势329
12.3 ReKotlin331
12.3.1 初见 ReKotlin331
12.3.2 创建基于ReKotlin的项目332
12.4 解耦视图导航341
12.4.1 传统导航的问题341
12.4.2 rekotlin-router342
12.5 本章小结343
第13章 开发响应式Web应用345
13.1 响应式编程的关键:非阻塞异步编程模型345
13.1.1 使用CompletableFuture实现异步非阻塞346
13.1.2 使用RxKotlin进行响应式编程347
13.1.3 响应式Web编程框架348
13.2 Spring 5:响应式Web框架349
13.2.1 支持响应式编程349
13.2.2 适配Kotlin350
13.2.3 函数式路由351
13.2.4 异步数据库驱动353
13.3 Spring 5响应式编程实战354
13.4 本章小结360

推荐

车牌查询
桂ICP备20004708号-3