| 作者 |
| 肯·寇森 水滴技术团队 |
| 丛书名 |
| O’Reilly精品图书系列 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9782007141100 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------Kotlin编程实践--------------------------- 本书的重点不仅在于讲解 Kotlin 的语法与语义,还将展示何时以及为何应该使用某个指定的语言特性。本书的目标不一定会涵盖每一个 Kotlin 语法与库的细节。但在最后,本书添加了很多基本原理的内容,让即使只有 Kotlin 初级知识的读者也可以理解本书的内容。当你认真学习 Kotlin 的细节后,你就可以使用这门受欢迎的语言构建 Android 应用、Web 应用以及其他程序。Kotlin 不仅可以用于任何应用 Java 的地方,还可以用于 iOS 开发、编写原生应用程序、JavaScript 开发以及更多场景。 ---------------------------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 前言 3 第1章 安装并运行Kotlin 11 1.1 在没有本地编译器的情况下运行Kotlin 11 1.2 在本地安装Kotlin 13 1.3 在命令行中编译并运行Kotlin 15 1.4 使用Kotlin REPL 16 1.5 执行Kotlin脚本 17 1.6 使用GraalVM构建独立应用程序 18 1.7 为Gradle添加Kotlin插件(Groovy语法) 21 1.8 为Gradle添加Kotlin插件(Kotlin语法) 24 1.9 使用Gradle构建Kotlin工程 26 1.10 使用Maven编译Kotlin 27 第2章 Kotlin基础 31 2.1 在Kotlin中使用可空类型 31 2.2 在Java中添加可空指示器 34 2.3 为Java添加重载方法 36 2.4 显式类型转换 40 2.5 打印不同的进制 42 2.6 数幂 44 2.7 使用移位运算符 46 2.8 使用位布尔运算符 49 2.9 使用to函数创建Pair实例 52 第3章 Kotlin中的面向对象编程 55 3.1 理解const与val的不同之处 55 3.2 创建自定义的getter与setter 56 3.3 定义数据类 59 3.4 幕后属性技术 62 3.5 操作符重载 65 3.6 使用lateinit进行延迟初始化 67 3.7 使用安全转换函数、恒等操作符,以及Elvis操作符覆盖equals函数 70 3.8 创建单例 72 3.9 无事生非 75 第4章 函数式编程 79 4.1 在算法中使用fold 79 4.2 使用reduce函数进行归约 82 4.3 使用尾递归 84 第5章 集合 89 5.1 使用数组 89 5.2 创建集合 92 5.3 为已存在的集合创建只读视图 94 5.4 从集合构建map 96 5.5 当集合为空的时候返回默认值 97 5.6 将变量限制在给定区间 98 5.7 处理集合中的窗口 100 5.8 解构list 102 5.9 将多个属性排序 103 5.10 自定义迭代器 105 5.11 根据类型过滤集合 107 5.12 在数列中创建区间 108 第6章 序列 113 6.1 使用懒序列 113 6.2 生成序列 115 6.3 管理无限序列 117 6.4 以固定间隔从序列生成元素 119 第7章 作用域函数 123 7.1 使用apply函数在构造结束之后初始化对象 123 7.2 使用also函数进行其他操作 124 7.3 使用let函数与Elvis 126 7.4 使用let函数代替临时变量 128 第8章 Kotlin委托 131 8.1 使用委托实现组合 131 8.2 使用lazy委托 134 8.3 确保值不为空 136 8.4 使用observable与vetoable委托 137 8.5 使用映射作为委托 141 8.6 创建你自己的委托 143 第9章 测试 147 9.1 设置测试类的生命周期 147 9.2 使用数据类进行测试 152 9.3 使用帮助函数并使用默认参数 154 9.4 使用不同的参数重复JUnit 5的测试 156 9.5 使用数据类进行参数化测试 159 第10章 输入/输出 161 10.1 使用use函数管理资源 161 10.2 写文件 164 第11章 其他 167 11.1 在代码中获取Kotlin版本号 167 11.2 重复执行lambda表达式 169 11.3 强制when语句进行穷举 170 11.4 在正则表达式中使用replace函数 172 11.5 转换为二进制字符串并返回 174 11.6 使一个类可执行 176 11.7 测量经过时间 179 11.8 启动线程 180 11.9 使用TODO强制完成 183 11.10 理解Random的随机行为 185 11.11 在函数命名中使用特殊字符 187 11.12 告知Java处理异常 188 第12章 Spring框架 191 12.1 开放用于继承的Spring管理的bean类 191 12.2 持久化Kotlin数据类 194 12.3 依赖注入 196 第13章 协程与结构化并发 201 13.1 选择协程构建器 201 13.2 使用withContext替换async/await 207 13.3 使用协程调度器 208 13.4 在Java线程池上运行协程 210 13.5 取消协程 213 13.6 协程调试 216 ---------------------------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 |