作者 |
文卡特·苏布拉马尼亚姆 霍丙乾 |
丛书名 |
华章程序员书库 |
出版社 |
机械工业出版社 |
ISBN |
9782106021442 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------8081117 - Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序--------------------------- 本书面向程序员、开发主管、架构师和技术经理。假定读者熟悉编程的基础知识,同时也假定读者对Java和JDK有一定的了解。第I部分主要介绍使用Kotlin编写脚本。第II部分是关于面向对象的编程。在第III部分中,你将学习如何使用该语言的函数风格的功能。第IV部分将把目前为止所学的知识结合起来,使你的代码更加流畅,并教会你如何创建内部领域特定语言(DSL)。在第V部分中,你将了解新的协程和异步编程。第VI部分涉及Java的互操作、测试、使用带有Spring的Kotlin,以及使用Kotlin编写Android应用程序。 ---------------------------8070492 - 深入理解Kotlin协程--------------------------- 内容简介 这是一部从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架、应用案例等多个维度全面讲解Kotlin协程的专著,它同时提供了多语言视角,亦可通过本书了解其他语言的协程。 本书作者是腾讯的的高级工程师,是国内Kotlin领域的先驱者和布道者,不仅在工程实践领域积累了丰富的经验,而且在Kotlin开发者社群里有广泛的影响力和号召力。 全书共9章: 第1章从协程的核心应用场景——异步程序设计的思路和关键问题切入,引出Kotlin协程的概念; 第2章首先介绍了协程的概念、分类,然后讲解了Python、Lua、Go等不同语言的协程实现和对比; 第3~4章以 Kotlin 标准库的协程 API 为核心,讲解了简单协程的使用方法和运行机制,以及通过简单协程设计和实现复合协程的思路和方法; 第5~6章以Kotlin的官方协程框架为模板,通过逐步实现其中的核心功能,分析了其中的实现细节和复合协程的运行机制,并对框架的使用做了深入探讨; . 第7~8章讲解了协程在Android应用开发和Web服务开发中的应用场景、面临的挑战,以及解决各种常见问题的方法和思路; 第9章探讨了JavaScript 和 Native等非JVM平台对协程的支持情况,以及协程在这些平台上的应用。 |
目录 |
[套装书具体书目] 8070492 - 深入理解Kotlin协程 - 9787111655916 - 机械工业出版社 - 定价 79 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 ---------------------------8070492 - 深入理解Kotlin协程--------------------------- 前言 第1章 异步程序设计介绍 1 1.1 异步的概念 1 1.1.1 程序的执行 1 1.1.2 异步与回调 2 1.1.3 回调地狱 3 1.2 异步程序设计的关键问题 4 1.2.1 结果传递 4 1.2.2 异常处理 6 1.2.3 取消响应 8 1.2.4 复杂分支 9 1.3 常见异步程序设计思路 10 1.3.1 Future 11 1.3.2 CompletableFuture 11 1.3.3 Promise与async/await 13 1.3.4 响应式编程 15 1.3.5 Kotlin协程 15 1.4 本章小结 17 第2章 协程的基本概念 18 2.1 协程究竟是什么 18 2.2 协程的分类 20 2.2.1 按调用栈分类 20 2.2.2 按调度方式分类 22 2.3 协程的实现举例 22 2.3.1 Python的Generator 23 2.3.2 Lua标准库的协程实现 24 2.3.3 Go的go routine 27 2.4 本章小结 30 第3章 Kotlin协程的基础设施 31 3.1 协程的构造 31 3.1.1 协程的创建 32 3.1.2 协程的启动 32 3.1.3 协程体的Receiver 34 3.1.4 可挂起的main函数 36 3.2 函数的挂起 37 3.2.1 挂起函数 37 3.2.2 挂起点 38 3.2.3 CPS变换 39 3.3 协程的上下文 41 3.3.1 协程上下文的集合特征 41 3.3.2 协程上下文元素的实现 42 3.3.3 协程上下文的使用 43 3.4 协程的拦截器 45 3.4.1 拦截的位置 45 3.4.2 拦截器的使用 46 3.4.3 拦截器的执行细节 47 3.5 Kotlin协程所属的类别 48 3.5.1 调用栈的广义和狭义 48 3.5.2 调度关系的对立与统一 49 3.6 本章小结 50 第4章 Kotlin协程的拓展实践 51 4.1 序列生成器 51 4.1.1 仿Python的Generator实现 52 4.1.2 标准库的序列生成器介绍 56 4.2 Promise模型 57 4.2.1 async/await与suspend的设计对比 58 4.2.2 仿JavaScript的async/await实现 59 4.3 Lua风格的协程API 61 4.3.1 非对称API实现 61 4.3.2 对称API实现 67 4.4 再谈协程的概念 72 4.4.1 简单协程与复合协程 73 4.4.2 复合协程的实现模式 73 4.5 本章小结 74 第5章 Kotlin协程框架开发初探 75 5.1 开胃菜:实现一个delay函数 75 5.2 协程的描述 77 5.2.1 协程的描述类 78 5.2.2 协程的状态 79 5.2.3 支持回调的状态 80 5.2.4 协程的初步实现 83 5.3 协程的创建 84 5.3.1 无返回值的launch 84 5.3.2 实现invokeOnCompletion 85 5.3.3 实现join 89 5.3.4 有返回值的async 90 5.4 协程的调度 92 5.4.1 协程的执行调度 92 5.4.2 协程的调度位置 93 5.4.3 协程的调度器设计 93 5.4.4 基于线程池的调度器 94 5.4.5 基于UI事件循环的调度器 96 5.4.6 为协程添加默认调度器 97 5.5 协程的取消 98 5.5.1 完善协程的取消逻辑 98 5.5.2 支持取消的挂起函数 100 5.5.3 CancellableContinuation的实现 103 5.5.4 改造挂起函数 106 5.6 协程的异常处理 109 5.6.1 定义异常处理器 110 5.6.2 处理协程的未捕获异常 111 5.6.3 区别对待取消异常 111 5.6.4 异常处理器的运用 113 5.7 协程的作用域 113 5.7.1 作用域的概念 113 5.7.2 作用域的声明 114 5.7.3 建立父子关系 116 5.7.4 顶级作用域 116 5.7.5 协同作用域 117 5.7.6 suspend fun main的作用域 119 5.7.7 实现异常的传播 120 5.7.8 主从作用域 121 5.7.9 完整的异常处理流程 122 5.7.10 父协程等待子协程完成 122 5.8 本章小结 123 第6章 Kotlin协程的官方框架 124 6.1 协程框架概述 124 6.1.1 框架的构成 124 6.1.2 协程的启动模式 126 6.1.3 协程的调度器 127 6.1.4 协程的全局异常处理器 129 6.1.5 协程的取消检查 130 6.1.6 协程的超时取消 132 6.1.7 禁止取消 133 6.2 热数据通道Channel 134 6.2.1 认识Channel 134 6.2.2 Channel的容量 136 6.2.3 迭代Channel 138 6.2.4 produce和actor 138 6.2.5 Channel的关闭 140 6.2.6 BroadcastChannel 142 6.2.7 Channel版本的序列生成器 144 6.2.8 Channel的内部结构 146 6.3 冷数据流Flow 148 6.3.1 认识Flow 149 6.3.2 对比RxJava的线程切换 150 6.3.3 冷数据流 151 6.3.4 异常处理 151 6.3.5 末端操作符 153 6.3.6 分离Flow的消费和触发 153 6.3.7 Flow的取消 154 6.3.8 其他Flow的创建方式 155 6.3.9 Flow的背压 155 6.3.10 Flow的变换 157 6.4 多路复用select 158 6.4.1 复用多个await 158 6.4.2 复用多个Channel 160 6.4.3 SelectClause 161 6.4.4 使用Flow实现多路复用 161 6.5 并发安全 163 6.5.1 不安全的并发访问 163 6.5.2 协程的并发工具 164 6.5.3 避免访问外部可变状态 165 6.6 本章小结 166 第7章 Kotlin协程在Android上的应用 167 7.1 Android上的异步问题 167 7.1.1 基于UI的异步问题分析 167 7.1.2 “鸡肋”的AsyncTask 169 7.1.3 “烫手”的回调 169 7.1.4 “救世”的RxJava 170 7.2 协程对UI的支持 173 7.2.1 UI调度器 173 7.2.2 协程版AutoDispose 174 7.2.3 Lifecycle的协程支持 176 7.3 常见框架的协程扩展 177 7.3.1 RxJava的扩展 177 7.3.2 异步组件ListenableFuture 179 7.3.3 ORM框架Room 180 7.3.4 图片加载框架coil 181 7.3.5 网络框架Retrofit 182 7.3.6 协程风格的对话框 183 7.4 本章小结 184 第8章 Kotlin协程在Web服务中的应用 185 8.1 多任务并发模型 185 8.1.1 多进程的服务模型 185 8.1.2 多线程的服务模型 186 8.1.3 事件驱动与异步I/O 186 8.2 协程在多任务模型中的运用 190 8.2.1 协程与异步I/O 191 8.2.2 协程与“轻量级线程” 192 8.3 常见Web应用框架的协程扩展 193 8.3.1 Spring的响应式支持 193 8.3.2 Vert.x 196 8.3.3 Ktor 199 8.4 本章小结 203 第9章 Kotlin协程在其他平台上的应用 204 9.1 Kotlin-Js 204 9.1.1 Kotlin-Js概述 205 9.1.2 Kotlin-Js上的协程 209 9.2 Kotlin-Native 212 9.2.1 Kotlin-Native概述 212 9.2.2 Kotlin-Native的协程支持 218 9.3 本章小结 221 |