内容简介
热身篇 Kotlin基础
第1章 认识Kotlin
1.1 Java的发展
1.1.1 Java 8的探索
1.1.2 Java未来的样子
1.2 Scala的百宝箱
1.2.1 学术和工业的平衡
1.2.2 复合但不复杂
1.2.3 简单却不容易
1.3 Kotlin——改良的Java
1.3.1 Kotlin的实用主义
1.3.2 更好的Java
1.3.3 强大的生态
1.4 本章小结
第2章 基础语法
2.1 不一样的类型声明
2.1.1 增强的类型推导
2.1.2 声明函数返回值类型
2.2 val和var的使用规则
2.2.1 val的含义:引用不可变
2.2.2 优先使用val来避免副作用
2.2.3 var的适用场景
2.3 高阶函数和Lambda
2.3.1 抽象和高阶函数
2.3.2 实例:函数作为参数的需求
2.3.3 函数的类型
2.3.4 方法和成员引用
2.3.5 匿名函数
2.3.6 Lambda是语法糖
2.3.7 函数、Lambda和闭包
2.3.8 “柯里化”风格、扩展函数
2.4面向表达式编程
2.4.1 表达式比语句更安全
2.4.2 Unit类型:让函数调用皆为表达式
2.4.3 复合表达式:更好的表达力
2.4.4 枚举类和when表达式
2.4.5 for循环和范围表达式
2.4.6 中缀表达式
2.5 字符串的定义和操作
2.5.1 定义原生字符串
2.5.2 字符串模板
2.5.3 字符串判等
2.6 本章小结
下水篇 Kotlin核心
第3章 面向对象
3.1 类和构造方法
3.1.1 Kotlin中的类及接口
3.1.2 更简洁地构造类的对象
3.1.3 主从构造方法
3.2 不同的访问控制原则
3.2.1 限制修饰符
3.2.2 可见性修饰符
3.3 解决多继承问题
3.3.1 骡子的多继承困惑
3.3.2 接口实现多继承
3.3.3 内部类解决多继承问题的方案
3.3.4 使用委托代替多继承
3.4 真正的数据类
3.4.1 烦琐的JavaBean
3.4.2 用data class创建数据类
3.4.3 copy、componentN与解构
3.4.4 数据类的约定与使用
3.5 从static到object
3.5.1 什么是伴生对象
3.5.2 天生的单例:object
3.5.3 object表达式
3.6 本章小结
第4章 代数数据类型和模式匹配
4.1 代数数据类型
4.1.1 从代数到类型
4.1.2 计数
4.1.3 积类型
4.1.4 和类型与密封类
4.1.5 构造代数数据类型
4.2 模式匹配
4.2.1 何为模式
4.2.2 常见的模式
4.2.3 处理嵌套表达式
4.2.4 通过Scala找点灵感
4.2.5 用when力挽狂澜
4.3 增强Kotlin的模式匹配
4.3.1 类型测试/类型转换
4.3.2 面向对象的分解
4.3.3 访问者设计模式
4.3.4 总结
4.4 用代数数据类型来抽象业务
4.4.1 从一个实际需求入手
4.4.2 糟糕的设计
4.4.3 利用ADT
4.4.4 更高层次的抽象
4.5 本章总结
第5章 类型系统
5.1 null引用:10亿美元的错误
5.1.1 null做了哪些恶
5.1.2 如何解决NPE问题
5.2 可空类型
5.2.1 Java 8中的Optional
5.2.2 Kotlin的可空类型
5.2.3 类型检查
5.2.4 类型智能转换
5.3 比Java更面向对象的设计
5.3.1 Any:非空类型的根类型
5.3.2 Any?:所有类型的根类型
5.3.3 Nothing与Nothing?
5.3.4 自动装箱与拆箱
5.3.5 “新”的数组类型
5.4 泛型:让类型更加安全
5.4.1 泛型:类型安全的利刃
5.4.2 如何在Kotlin中使用泛型
5.4.3 类型约束:设定类型上界
5.5 泛型的背后:类型擦除
5.5.1 Java为什么无法声明一个泛型数组
5.5.2 向后兼容的罪
5.5.3 类型擦除的矛盾
5.5.4 使用内联函数获取泛型
5.6 打破泛型不变
5.6.1 为什么List〈String〉不能赋值给List〈Object〉
5.6.2 一个支持协变的List
5.6.3 一个支持逆变的Comparator
5.6.4 协变和逆变
5.7 本章小结
第6章 Lambda和集合
6.1 Lambda简化表达
6.1.1 调用Java的函数式接口
6.1.2 带接收者的Lambda
6.1.3 with和apply
6.2 集合的高阶函数API
6.2.1 以简驭繁:map
6.2.2 对集合进行筛选:filter、count
6.2.3 别样的求和方式:sumBy、sum、fold、reduce
6.2.4 根据学生性别进行分组:groupBy
6.2.5 扁平化——处理嵌套集合:flatMap、flatten
6.3 集合库的设计
6.3.1 集合的继承关系
6.3.2 可变集合与只读集合
6.4 惰性集合
6.4.1 通过序列提高效率
6.4.2 序列的操作方式
6.4.3 序列可以是无限的
6.4.4 序列与Java 8 Stream对比
6.5 内联函数
6.5.1 优化Lambda开销
6.5.2 内联函数具体语法
6.5.3 noinline:避免参数被内联
6.5.4 非局部返回
6.5.5 crossinline
6.5.6 具体化参数类型
6.6 本章小结
第7章 多态和扩展
7.1 多态的不同方式
7.1.1 子类型多态
7.1.2 参数多态
7.1.3 对第三方类进行扩展
7.1.4 特设多态与运算符重载
7.2 扩展:为别的类添加方法、属性
7.2.1 扩展与开放封闭原则
7.2.2 使用扩展函数、属性
7.2.3 扩展的特殊情况
7.2.4 标准库中的扩展函数:run、let、also、takeIf
7.3 Android中的扩展应用
7.3.1 优化Snackbar
7.3.2 用扩展函数封装Utils
7.3.3 解决烦人的findViewById
7.4 扩展不是万能的
7.4.1 调度方式对扩展函数的影响
7.4.2 被滥用的扩展函数
7.5 本章小结
第8章 元编程
8.1 程序和数据
8.1.1 什么是元编程
8.1.2 常见的元编程技术
8.2 Kotlin的反射
8.2.1 Kotlin和Java反射
8.2.2 Kotlin的KClass
8.2.3 Kotlin的KCallable
8.2.4 获取参数信息
8.3 Kotlin的注解
8.3.1 无处不在的注解
8.3.2 精确控制注解的位置
8.3.3 获取注解信息
8.4 本章小结
潜入篇 Kotlin探索
第9章 设计模式
9.1 创建型模式
9.1.1 伴生对象增强工厂模式
9.1.2 内联函数简化抽象工厂
9.1.3 用具名可选参数而不是构建者模式
9.2 行为型模式
9.2.1 Kotlin中的观察者模式
9.2.2 高阶函数简化策略模式、模板方法模式
9.2.3 运算符重载和迭代器模式
9.2.4 用偏函数实现责任链模式
9.2.5 ADT实现状态模式
9.3 结构型模式
9.3.1 装饰者模式:用类委托减少样板代码
9.3.2 通过扩展代替装饰者
9.4 本章小结
第10章 函数式编程
10.1 函数式编程的特征
10.1.1 函数式语言之争
10.1.2 纯函数与引用透明性
10.1.3 代换模型与惰性求值
10.2 实现Typeclass
10.2.1 高阶类型:用类型构造新类型
10.2.2 高阶类型和Typeclass
10.2.3 用扩展方法实现Typeclass
10.2.4 Typeclass设计常见功能
10.3 函数式通用结构设计
10.3.1 Monoid
10.3.2 Monad
10.3.3 Monad组合副作用
10.4 类型代替异常处理错误
10.4.1 Option与OptionT
10.4.2 Either与EitherT
10.5 本章小结
第11章 异步和并发
11.1 同步到异步
11.1.1 同步与阻塞的代价
11.1.2 利用异步非阻塞来提高效率
11.1.3 回调地狱
11.2 Kotlin的Coroutine
11.2.1 多线程一定优于单线程吗
11.2.2 协程:一个更轻量级的“线程”
11.2.3 合理地使用协程
11.2.4 用同步方式写异步代码
11.3 共享资源控制
11.3.1 锁模式
11.3.2 Actor:有状态的并行计算单元
11.4 CQRS架构
11.4.1 Event Sourcing事件溯源——记录对象操作轨迹
11.4.2 Kotlin with Akka Persistence-Actor
11.5 本章小结
遨游篇 Kotlin实战
第12章 基于Kotlin的Android架构
12.1 架构方式的演变
12.1.1 经典的MVC问题
12.1.2 MVP
12.1.3 MVVM
12.2 单向数据流模型
12.2.1 Redux
12.2.2 单向数据流的优势
12.3 ReKotlin
12.3.1 初见ReKotlin
12.3.2 创建基于ReKotlin的项目
12.4 解耦视图导航
12.4.1 传统导航的问题
12.4.2 rekotlin-router
12.5 本章小结
第13章 开发响应式Web应用
13.1 响应式编程的关键:非阻塞异步编程模型
13.1.1 使用CompletableFuture实现异步非阻塞
13.1.2 使用RxKotlin进行响应式编程
13.1.3 响应式Web编程框架
13.2 Spring 5:响应式Web框架
13.2.1 支持响应式编程
13.2.2 适配Kotlin
13.2.3 函数式路由
13.2.4 异步数据库驱动
13.3 Spring 5响应式编程实战
13.4 本章小结