| 作者 |
| 霍丙乾 水滴技术团队 |
| 丛书名 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9782006091040 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------深入理解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平台对协程的支持情况,以及协程在这些平台上的应用。 ---------------------------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响应式框架和编程等内容。 |
| 目录 |
---------------------------深入理解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 ---------------------------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 |