作者 |
文卡特·苏布拉马尼亚姆 彼得·佐默霍夫 |
丛书名 |
华章程序员书库 |
出版社 |
机械工业出版社 |
ISBN |
9782106021450 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------8081117 - Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序--------------------------- 本书面向程序员、开发主管、架构师和技术经理。假定读者熟悉编程的基础知识,同时也假定读者对Java和JDK有一定的了解。第I部分主要介绍使用Kotlin编写脚本。第II部分是关于面向对象的编程。在第III部分中,你将学习如何使用该语言的函数风格的功能。第IV部分将把目前为止所学的知识结合起来,使你的代码更加流畅,并教会你如何创建内部领域特定语言(DSL)。在第V部分中,你将了解新的协程和异步编程。第VI部分涉及Java的互操作、测试、使用带有Spring的Kotlin,以及使用Kotlin编写Android应用程序。 ---------------------------8069447 - Kotlin移动应用开发--------------------------- 本书分为两个部分。第一部分从概述Kotlin语言开始,介绍了Kotlin的基本语言结构、Kotlin中的函数式编程、Kotlin中的面向对象、Kotlin与Java的互操作性,以及Kotin的并发性。第二部分讲解了如何使用Kotlin来进行Android应用程序开发,包括一个待办事项应用和一个较为复杂的为使用者提供营养数据的应用,以帮助读者实践第一部分学到的知识,本书最后讲解了如何简洁地使用Kotlin的语言特性来创建简单的DSL,以及如何将Java程序迁移到Kotlin。 |
目录 |
[套装书具体书目] 8069447 - Kotlin移动应用开发 - 9787111650935 - 机械工业出版社 - 定价 99 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 ---------------------------8069447 - Kotlin移动应用开发--------------------------- 译者序 序 前言 第一部分 学习Kotlin 第1章 Kotlin简介2 1.1 Kotlin是什么2 1.2 Kotlin的目标和语言特性3 1.3 为什么在Android系统开发中使用Kotlin4 1.3.1 Android中的Java4 1.3.2 Android中的Kotlin5 1.4 Kotlin与Java 85 1.5 支持的工具与社区6 1.6 商业角度6 1.7 谁在使用Kotlin7 1.8 本章小结8 第2章 走进Kotlin9 2.1 Kotlin REPL交互式编程命令行9 2.2 变量和数据类型10 2.2.1 变量声明10 2.2.2 基本数据类型11 2.2.3 类型推导12 2.3 条件语句13 2.3.1 将if和when作为语句13 2.3.2 条件表达式15 2.4 循环和范围17 2.4.1 while循环17 2.4.2 for循环17 2.5 函数19 2.5.1 函数签名19 2.5.2 单行表达式函数的简写方式20 2.5.3 main函数20 2.5.4 参数默认值和指定参数名称21 2.5.5 扩展函数22 2.5.6 中缀函数24 2.5.7 运算符函数25 2.6 空安全26 2.6.1 可空类型26 2.6.2 可空类型的使用27 2.7 相等性检查29 2.8 异常处理30 2.8.1 异常处理的原则30 2.8.2 Kotlin的异常处理31 2.8.3 Checked异常和Unchecked异常32 2.9 本章小结33 第3章 Kotlin中的函数式编程34 3.1 函数式编程的目的34 3.2 函数36 3.3 Lambda表达式37 3.4 高阶函数38 3.5 集合的使用41 3.5.1 集合API在Kotlin与Java中的区别42 3.5.2 在Kotlin中实例化集合42 3.5.3 集合的访问和编辑43 3.5.4 过滤集合44 3.5.5 映射集合44 3.5.6 集合分组45 3.5.7 集合关联46 3.5.8 计算最小值、最大值,以及和46 3.5.9 集合排序46 3.5.10 折叠集合47 3.5.11 链式函数调用49 3.6 作用域函数49 3.6.1 let函数的使用49 3.6.2 apply函数的使用50 3.6.3 with函数的使用51 3.6.4 run函数的使用52 3.6.5 also函数的使用54 3.6.6 use函数的使用54 3.6.7 组合高阶函数55 3.6.8 带接收者的Lambda56 3.7 惰性序列57 3.7.1 惰性计算57 3.7.2 使用惰性序列58 3.7.3 惰性序列的性能60 3.8 本章小结62 第4章 Kotlin中的面向对象63 4.1 类和对象的实例化63 4.2 属性64 4.2.1 属性和字段65 4.2.2 getter和setter66 4.2.3 延迟初始化属性67 4.2.4 委托属性68 4.2.5 预定义委托69 4.2.6 委托给map71 4.2.7 使用委托的实现72 4.3 方法73 4.3.1 扩展方法74 4.3.2 嵌套类和内部类75 4.4 主构造函数和次构造函数76 4.4.1 主构造函数76 4.4.2 次构造函数77 4.5 继承和重写规则78 4.5.1 接口78 4.5.2 抽象类80 4.5.3 开放类81 4.5.4 重写规则81 4.6 类型检查和转换82 4.6.1 类型检查82 4.6.2 类型转换82 4.6.3 智能转换83 4.7 可见性84 4.7.1 类或接口中的声明84 4.7.2 顶级声明86 4.8 数据类86 4.8.1 使用数据类87 4.8.2 数据类的继承88 4.9 枚举89 4.10 密封类91 4.11 对象和伴生93 4.11.1 把对象声明为单例95 4.11.2 伴生对象95 4.12 泛型97 4.12.1 泛型类和泛型函数97 4.12.2 协变和逆变101 4.12.3 声明处型变104 4.12.4 使用处型变107 4.12.5 受限的类型参数109 4.12.6 星形投影110 4.13 本章小结112 第5章 与Java的互操作性113 5.1 在Kotlin中使用Java代码113 5.1.1 调用getter和setter114 5.1.2 处理可空属性115 5.1.3 转义冲突的Java标识符119 5.1.4 调用可变参数方法120 5.1.5 使用操作符120 5.1.6 使用SAM类型121 5.1.7 关于互操作性更进一步的考虑121 5.2 在Java中使用Kotlin代码122 5.2.1 访问属性122 5.2.2 将属性作为字段公开124 5.2.3 使用文件级声明125 5.2.4 调用扩展函数126 5.2.5 访问静态成员127 5.2.6 生成重载方法129 5.2.7 使用密封类和数据类130 5.2.8 可见性131 5.2.9 获取KClass132 5.2.10 处理签名冲突132 5.2.11 使用内联函数133 5.2.12 异常处理134 5.2.13 使用可变类型135 5.2.14 Nothing类型136 5.3 互操作的最佳实践137 5.3.1 写出对Kotlin友好的Java代码137 5.3.2 写出对Java友好的Kotlin代码137 5.4 本章小结138 第6章 Kotlin中的并发140 6.1 并发140 6.1.1 普遍难题142 6.1.2 最先进的解决方案143 6.2 Kotlin中的协程146 6.2.1 引入协程146 6.2.2 基本概念147 6.2.3 挂起函数147 6.2.4 协程构建器150 6.2.5 生成器169 6.2.6 actors和channels171 6.2.7 并发样式178 6.2.8 协程实践178 6.2.9 内部实现183 6.3 本章小结185 第二部分 使用Kotlin进行Android开发 第7章 使用Kotlin进行Android应用程序开发:Kudoo App188 7.1 在Android上配置Kotlin188 7.1.1 在Android Studio上使用Kotlin188 7.1.2 自动生成Gradle配置188 7.1.3 修改Gradle配置190 7.1.4 使用注解处理器191 7.1.5 把Java代码转换成Kotlin192 7.2 编写待办事项列表应用Kudoo192 7.2.1 创建项目193 7.2.2 添加RecyclerView195 7.2.3 添加Room数据库203 7.2.4 使用ViewModel208 7.2.5 集成LiveData212 7.2.6 添加新的待办事项214 7.2.7 启用检查待办事项218 7.3 本章小结219 第8章 使用Kotlin进行Android应用程序开发:Nutrilicious221 8.1 新建并配置项目222 8.2 为主页面添加RecyclerView223 8.2.1 为MainActivity布局223 8.2.2 为RecyclerView的项目布局224 8.2.3 实现Food模型226 8.2.4 实现RecyclerView的适配器226 8.2.5 在MainActivity中添加RecyclerView228 8.3 调用Nutrition的API从USDA中拉取数据230 8.3.1 使用Retrofit230 8.3.2 执行API请求235 8.4 映射JSON数据和领域类236 8.4.1 将JSON数据映射到数据传输对象237 8.4.2 将数据传输对象映射为model类239 8.5 在搜索逻辑中使用ViewModel241 8.6 增加搜索食品功能243 8.7 介绍Fragment I:实现搜索Fragment246 8.8 介绍Fragment II:实现收藏Fragment254 8.9 在Room数据库中存储用户收藏食品数据258 8.10 从USDA食品报告API中拉取营养详情数据265 8.11 集成详情页270 8.12 在数据库中存储食品详情277 8.13 为可操作的数据添加RDI282 8.14 优化用户体验286 8.14.1 在搜索页面增加结果为空时的说明286 8.14.2 在详情页增加进度说明287 8.15 本章小结288 第9章 Kotlin DSL289 9.1 DSL简介289 9.1.1 什么是DSL289 9.1.2 优点和缺点290 9.2 在Kotlin中创建DSL292 9.2.1 使用DSL来构建复杂对象292 9.2.2 通过构建器来保持不变性294 9.2.3 深入嵌套296 9.2.4 @DslMarker注解简介298 9.2.5 语言特性299 9.3 DSL在Android布局中的应用—使用Anko301 9.3.1 在代码中创建布局301 9.3.2 Anko依赖302 9.3.3 使用Anko创建布局303 9.3.4 添加布局参数303 9.3.5 将Kudoo中的AddTodoActivity的布局迁移到Anko布局304 9.3.6 增加自定义view306 9.3.7 比较Anko布局和XML布局307 9.4 DSL在Gradle构建脚本中的应用308 9.4.1 将项目Nutrilicious迁移到Gradle Kotlin DSL308 9.4.2 在Gradle中使用buildSrc313 9.4.3 优点和缺点314 9.5 本章小结315 第10章 迁移到Kotlin316 10.1 软件中的移植316 10.2 引领改变317 10.2.1 获得认可318 10.2.2 知识分享319 10.3 部分或整体迁移320 10.3.1 部分迁移320 10.3.2 整体迁移321 10.4 从何处开始322 10.4.1 测试代码322 10.4.2 生产代码323 10.4.3 宠物程序323 10.4.4 制定计划324 10.5 工具支持325 10.5.1 Java-to-Kotlin转换器325 10.5.2 调整自动转换的代码326 10.6 本章小结327 附录 更多资源329 术语表332 |