编辑推荐 "本书几乎涵盖了Kotlin所有的特性,包括函数特性、面向对象特性、元编程、DSL、跨平台开发、协程、Flow、RxJava、Jetpack等,内容很好丰富。 本书还介绍了使用Kotlin开发的多个实例,如移动端实战、服务端实战、响应式开发实战等,这些例子是对本书知识的综合运用,对使用Kotlin进行开发的读者具备较大的参考价值。 本书是编者系统学习Kotlin和多年实战经验的积累和总结,通过很好简易的代码讲解Kotlin语言的各种特性,代码实例不会涉及过于抽象的业务场景,但会通过具体代码实例对Kotlin语言背后的设计思想和原理进行详细分析,力图使读者通过实际操作快速上手和深入理解Kotlin语言的相关知识。 本书面向所有希望从事 Android 开发和服务端开发的IT从业人员,希望读者通过阅读本书,使用Kotlin开发应用程序的技能更上一层楼。" 内容推荐 本书详细介绍了Kotlin语言方方面面的特性,包括各种类型的函数,贯彻本书始终的Lambda表达式,有别于Java的委托、泛型,灵活、简洁的DSL,常用的语法糖,相比线程更加轻量级的协程,参考RxJava实现的Flow,等等。本书还提供了大量涉及移动端、服务端甚至桌面端的案例,这些案例都是编者使用Kotlin之后的实践和心得,同时包含很多编者封装的library,供读者参考、借鉴和使用。 本书适合有一定Kotlin语法基础的读者使用,尤其适合移动端和服务端的开发人员使用,也可以用作大专院校和培训机构的教学参考书。 目录 目 录 章 认识Kotlin\t1 1.1 Kotlin简介\t1 1.1.1 Kotlin的历史\t1 1.1.2 Kotlin的特性\t1 1.2 Kotlin的发展\t2 1.2.1 实用主义\t2 1.2.2 生态圈\t3 1.2.3 逐渐Kotlin化的Java\t3 1.3 总结\t3 第2章 Kotlin的函数与类\t4 2.1 函数的基本概念\t4 2.1.1 函数的参数\t5 2.1.2 函数\t8 2.2 Kotlin的类(一)\t11 2.2.1 构造函数和初始化块\t12 2.2.2 属性\t15 2.2.3 抽象类\t16 2.2.4 嵌套类和内部类\t16 2.2.5 枚举类\t17 2.3 Kotlin的类(二)\t18 2.3.1 对象声明和对象表达式\t18 2.3.2 伴生对象\t19 2.3.3 数据类\t20 2.3.4 密封类\t23 2.4 总结\t24 第3章 Kotlin的函数式编程\t25 3.1 函数式编程与高阶函数\t25 3.1.1 函数式编程\t25 3.1.2 高阶函数\t25 3.2 Lambda表达式\t29 3.2.1 Java 8的Lambda\t29 3.2.2 Kotlin的Lambda语法\t31 3.2.3 简化Kotlin的Lambda表达式\t31 3.2.4 方法引用\t32 3.2.5 Kotlin支持SAM转换\t33 3.2.6 使用高阶函数的例子\t34 3.2.7 换个角度看 Lambda表达式\t35 3.3 集合、序列和Java中的流\t38 3.3.1 集合中的函数式API\t38 3.3.2 序列和流\t41 3.4 总结\t41 第4章 内联函数与扩展函数\t42 4.1 内联函数\t42 4.1.1 inline的使用\t42 4.1.2 禁用内联——noinline\t45 4.1.3 非局部返回以及crossinline的使用\t47 4.2 内联属性\t48 4.2.1 内联属性\t48 4.2.2 内联类\t48 4.3 扩展函数\t48 4.3.1 扩展函数的特性\t48 4.3.2 常用标准库的扩展函数\t51 4.4 扩展属性\t56 4.5 总结\t60 第5章 委托\t61 5.1 委托介绍\t61 5.1.1 静态代理\t61 5.1.2 动态代理\t62 5.2 Kotlin的委托模式和委托属性\t64 5.2.1 委托模式\t64 5.2.2 委托属性\t65 5.3 lateinit和by lazy\t69 5.4 总结\t73 第6章 泛型\t74 6.1 类型擦除\t74 6.1.1 Java泛型的优点\t74 6.1.2 Kotlin的泛型\t75 6.1.3 Java通过类型擦除支持泛型\t75 6.1.4 Kotlin如何获得声明的泛型类型\t77 6.2 型变\t80 6.2.1 类和类型\t80 6.2.2 型变\t80 6.3 泛型约束、类型投影与星号投影\t83 6.3.1 泛型约束\t83 6.3.2 类型投影\t84 6.3.3 星号投影\t84 6.3.4 泛型的应用\t85 6.4 总结\t86 第7章 元编程\t87 7.1 元编程\t87 7.1.1 元编程介绍\t87 7.1.2 元编程的分类\t87 7.1.3 根本没有什么元编程,从来只有编程而已\t88 7.2 Kotlin反射概述\t88 7.2.1 概述\t88 7.2.2 Kotlin反射API\t89 7.3 Java反射和Kotlin反射(上)\t90 7.3.1 类引用,获取Class对象\t90 7.3.2 构造函数引用,获取类的构造函数\t91 7.3.3 函数引用,获取类的成员函数\t92 7.3.4 属性引用,获取类的成员变量\t94 7.4 Java反射和Kotlin反射(下)\t96 7.4.1 获取类的其他信息\t96 7.4.2 Java反射与Kotlin反射的互操作性\t98 7.5 总结\t99 第8章 DSL的构建\t100 8.1 DSL介绍\t100 8.2 构建一个DSL的多种方式\t101 8.2.1 带接收者的函数类型\t101 8.2.2 带接收者的Lambda\t101 8.2.3 创建一个自己的DSL\t102 8.2.4 将扩展函数改成DSL的方式\t104 8.2.5 使用运算符重载实现DSL\t105 8.2.6 使用中缀表达式实现DSL\t106 8.2.7 Kotlin DSL的实际使用——封装路由框架的使用\t107 8.3 总结\t108 第9章 常用语法糖与设计模式\t110 9.1 运算符重载\t110 9.2 中缀表达式\t112 9.2.1 在扩展函数中使用中缀表达式\t113 9.2.2 在成员函数中使用中缀表达式\t113 9.3 作用域函数\t114 9.3.1 作用域函数的概念\t114 9.3.2 如何优雅地使用作用域函数\t114 9.4 Contract契约\t118 9.4.1 Contract的概念\t119 9.4.2 Contract的特性\t119 9.4.3 Contract源码解析\t120 9.4.4 小结\t122 9.5 在data class中使用MapStruct\t122 9.5.1 data class的copy()为浅拷贝\t122 9.5.2 MapStruct简介\t123 9.5.3 在Kotlin中使用MapStruct\t123 9.6 更好地使用设计模式\t126 9.6.1 单例模式\t126 9.6.2 builder模式\t127 9.6.3 观察者模式\t128 9.6.4 状态模式\t129 9.7 总结\t130 0章 跨平台开发\t131 10.1 跨平台的简单介绍\t131 10.1.1 跨平台开发的愿景\t131 10.1.2 跨平台开发当前的主流技术\t131 10.1.3 Kotlin与Flutter的对比\t132 10.2 利用Ktor-Client实现跨平台网络请求\t132 10.2.1 什么是Ktor\t132 10.2.2 Ktor-Client的使用\t132 10.3 总结\t142 1章 协程及其应用\t143 11.1 协程的基本概念\t143 11.1.1 协程的定义\t143 11.1.2 为何要使用协程\t143 11.1.3 Kotlin协程的基本概念\t148 11.2 Coroutine builders\t149 11.2.1 launch和async\t149 11.2.2 runBlocking\t152 11.3 挂起函数\t152 11.3.1 delay\t152 11.3.2 yield\t153 11.3.3 withContext\t154 11.3.4 coroutineScope\t156 11.4 协程的上下文和调度\t156 11.4.1 协程的调度\t156 11.4.2 父子协程\t158 11.4.3 多个CoroutineContext进行“+”操作\t160 11.4.4 CoroutineContext+Job\t161 11.5 协程的作用域 CoroutineScope\t162 11.5.1 尽量少用GlobalScope\t162 11.5.2 安全地使用CoroutineScope\t163 11.5.3 在Android中更好地使用Coroutines\t163 11.6 Channel机制\t164 11.6.1 生产者和消费者\t164 11.6.2 管道\t165 11.6.3 channel缓冲\t167 11.6.4 actor\t168 11.6.5 Select表达式\t169 11.7 总结\t170 2章 Flow的基本使用\t171 12.1 Flow的使用\t171 12.1.1 Kotlin Flow介绍\t171 12.1.2 Flow的基本使用方式\t171 12.1.3 Flow的生命周期\t176 12.2 Flow和RxJava\t177 12.2.1 Flow和Sequences\t177 12.2.2 Flow和RxJava\t178 12.3 Flow的异常处理\t182 12.3.1 catch操作符\t182 12.3.2 retry、retryWhen操作符\t184 12.4 Flow的线程操作\t185 12.4.1 更为简化的线程切换\t185 12.4.2 flowOn和RxJava的observeOn\t185 12.4.3 buffer实现并发操作\t186 12.4.4 并行操作\t188 12.5 Flow其他的操作符\t189 12.5.1 转换操作符\t189 12.5.2 限制大小的操作符\t189 12.5.3 终端操作符\t189 12.5.4 合并操作符\t190 12.5.5 扁平化操作符\t193 12.6 总结\t195 3章 RxJava的新特性及常用操作符\t198 13.1 RxJava入门\t198 13.1.1 RxJava入门理念\t198 13.1.2 RxJava的基础知识\t199 13.1.3 RxJava的生命周期\t201 13.2 RxJava 3新特性描述\t204 13.2.1 主要特性讲解\t204 13.2.2 与RxJava 2.x的区别\t204 13.2.3 RxJava 3新特性部分详述\t204 13.3 常用操作符讲解\t207 13.3.1 创建操作符\t207 13.3.2 转换操作符\t215 13.3.3 过滤操作符\t220 13.4 总结\t227 4章 RxJava的核心机制\t229 14.1 ObservableSource、Observable、Observer的同流合污\t229 14.2 恐怖的Function机制\t230 14.3 线程的决策者Scheduler\t231 14.3.1 Scheduler工作核心Worker\t232 14.3.2 Scheduler线程池核心RxThreadFactory\t232 14.3.3 异步实践例子\t233 14.3.4 并行的操作\t234 14.4 Observeable五兄弟的差异性\t235 14.4.1 Observable\t235 14.4.2 Flowable\t238 14.4.3 Single\t239 14.4.4 Completable\t240 14.4.5 Maybe\t240 14.5 背压策略\t241 14.5.1 MISSING\t242 14.5.2 ERROR\t242 14.5.3 BUFFER\t242 14.5.4 DROP\t243 14.5.5 LATEST\t243 14.6 总结\t243 5章 Jetpack\t244 15.1 Jetpack介绍\t244 15.1.1 客户端的架构迭代\t244 15.1.2 AAC的功能\t246 15.1.3 Android Jetpack\t247 15.2 Lifecycle\t249 15.2.1 Lifecycle介绍\t249 15.2.2 Lifecycle的使用\t250 15.2.3 Retrofit结合Lifecycle\t253 15.3 ViewModel\t254 15.3.1 ViewModel介绍\t254 15.3.2 ViewModel的使用\t255 15.3.3 使用Kotlin委托属性创建ViewModel\t256 15.3.4 AndroidViewModel\t257 15.3.5 ViewModel源码简单分析\t257 15.4 LiveData\t261 15.4.1 LiveData介绍\t261 15.4.2 LiveData的使用\t262 15.4.3 在ViewModel中使用LiveData\t263 15.4.4 LiveData实现Fragment之间的通信\t264 15.4.5 LiveData源码简单分析\t265 15.5 Room的用法\t267 15.5.1 Room的基本了解\t267 15.5.2 Room的配置与使用\t268 15.5.3 常用的SQL操作\t270 15.5.4 Room的兼容与升级\t271 15.5.5 小结\t275 15.6 Navigation用法详解\t276 15.6.1 Navigation的配置\t276 15.6.2 Navigation的基本使用\t277 15.6.3 Navigation原理解析\t284 15.6.4 小结\t287 15.7 总结\t287 6章 Android实战\t288 16.1 构建一个日志框架\t288 16.1.1 Android日志框架L\t288 16.1.2 如何开发一款类似L的日志框架\t289 16.1.3 记录Android日志更好的方式\t297 16.2 网络诊断工具\t297 16.3 使用Netty构建一个在Android上运行的Web服务器\t304 16.3.1 开发背景\t304 16.3.2 AndroidServer的特性\t304 16.3.3 AndroidServer的设计原理\t304 16.3.4 AndroidServer的使用\t310 16.4 实现协程版本的EventBus\t313 16.4.1 RxJava版本的EventBus\t313 16.4.2 Kotlin Coroutine版本的EventBus\t317 16.4.3 小结\t322 16.5 总结\t322 7章 响应式开发实战\t323 17.1 封装一个基于RxJava的任务框架RxTask\t323 17.1.1 RxTask奠基石的实现\t324 17.1.2 利用奠基石实现多种Task\t328 17.1.3 RxTask的改进,针对Java、Android平台进行适应\t335 17.2 基于Kotlin、RxJava实现的有限状态机\t339 17.2.1 状态机\t339 17.2.2 常用的状态机分类\t339 17.2.3 Kotlin开发的FSM\t340 17.2.4 应用\t351 17.3 Kotlin、RxJava以及传统的机器学习在手机质检上的应用\t353 17.3.1 业务背景\t353 17.3.2 设计思路\t353 17.3.3 代码实现以及踩过的坑\t355 17.3.4 后续的规划\t361 17.4 总结\t361 8章 服务端实战\t362 18.1 使用Ktor快速开发Web项目\t362 18.1.1 Ktor介绍\t362 18.1.2 Ktor服务端的使用\t362 18.1.3 例子\t365 18.2 使用WebFlux + R2DBC开发Web项目\t369 18.2.1 R2DBC介绍\t369 18.2.2 R2DBC的使用\t370 18.2.3 小结\t376 18.3 使用NetDiscovery开发网络爬虫\t376 18.3.1 NetDiscovery介绍\t376 18.3.2 DSL在爬虫框架中的使用\t379 18.3.3 Kotlin Coroutines在爬虫框架中的使用\t384 18.4 实现智能硬件的远程控制系统(上)\t388 18.4.1 业务背景及远程控制系统的功能\t388 18.4.2 远程控制系统服务端的设计\t388 18.4.3 远程控制系统的数据流向\t389 18.4.4 远程控制系统服务端的相关代码\t390 18.4.5 远程控制系统后续的规划\t397 18.5 实现智能硬件的远程控制系统(下)\t397 18.5.1 远程控制的客户端介绍\t397 18.5.2 Watcher的设计\t398 18.5.3 Watcher的核心代码\t399 18.5.4 小结\t408 18.6 总结\t408 |