目录
前言1
第1章 命令行13
1.1 初识Scala REPL14
1.2 在REPL中使用源代码和JAR文件17
1.3 初识Ammonite REPL20
1.4 scalac和scala命令23
1.5 反编译Scala代码25
1.6 运行JAR文件28
第2章 字符串31
2.1 字符串的相等性判断34
2.2 多行字符串的创建35
2.3 字符串的分割37
2.4 字符串的变量代入38
2.5 字符串输出的格式化41
2.6 字符串的逐个字符处理44
2.7 字符串的模式查找49
2.8 字符串的模式替换51
2.9 使用模式匹配提取字符串52
2.10 访问字符串中的单个字符54
2.11 自定义字符串插值器55
2.12 创建随机字符串58
第3章 数值和日期61
3.1 将字符串解析为数值64
3.2 数值类型间的转换66
3.3 覆盖默认的数值类型69
3.4 ++和--的替代方案71
3.5 浮点数的比较72
3.6 处理大数值74
3.7 生成随机数76
3.8 数值和货币的格式化78
3.9 创建新的日期和时间实例83
3.10 计算日期的差值85
3.11 日期的格式化86
3.12 将字符串解析为日期89
第4章 控制结构92
4.1 for循环95
4.2 多重for循环98
4.3 for循环中的守卫语句100
4.4 集合中的for/yield101
4.5 Scala中的“三元操作符”103
4.6 match表达式104
4.7 case的多条件匹配108
4.8 将match表达式的结果分配给变量109
4.9 访问match表达式的默认值110
4.10 match表达式与模式匹配110
4.11 match表达式与枚举和样例类116
4.12 case中的守卫语句118
4.13 match表达式与isInstanceOf120
4.14 match表达式与List122
4.15 用try/catch匹配一个或多个异常125
4.16 try/catch/finally128
4.17 创建自定义控制结构130
第5章 类133
5.1 挑选合适的领域建模工具134
5.2 创建主构造函数140
5.3 控制构造函数字段的可见性143
5.4 定义辅助构造函数146
5.5 定义私有的主构造函数148
5.6 构造函数参数的默认值150
5.7 类继承时的构造函数151
5.8 调用父类的构造函数154
5.9 定义equals方法(对象相等性)156
5.10 阻止生成访问方法和修改方法163
5.11 覆盖默认的访问方法和修改方法166
5.12 将代码块或函数赋值给惰性字段168
5.13 设置未初始化的var字段170
5.14 样例类产生的模板代码171
5.15 定义样例类的辅助构造函数176
第6章 特质和枚举178
6.1 特质的接口用法180
6.2 定义特质的抽象字段182
6.3 特质的抽象类用法184
6.4 特质的混入用法185
6.5 多特质同名方法处理与super关键字187
6.6 限制特质的拓展(仅支持特定类型的子类)191
6.7 限制特质的拓展(仅支持具有特定方法的类型)194
6.8 限制特质的拓展(仅支持特定的类)195
6.9 使用参数化特质196
6.10 特质的构造参数198
6.11特质与模块202
6.12 用枚举创建命名值的集208
6.13 用枚举建模ADT210
第7章 对象215
7.1 对象的强制转换215
7.2 用classOf方法传递Class类型217
7.3 用object创建单例对象218
7.4 用伴生对象创建静态成员219
7.5 用apply方法作为构造函数221
7.6 用apply方法实现静态工厂223
7.7 将特质具体化成对象224
7.8 unapply方法与模式匹配227
第8章 方法230
8.1 控制方法的作用域232
8.2 调用父类或特质的方法236
8.3 调用方法时使用参数名称239
8.4 设置参数的默认值240
8.5 可变参数242
8.6 无括号的方法调用243
8.7 声明异常244
8.8 支持链式调用风格246
8.9 扩展方法249
第9章 包和导入251
9.1 大括号风格的包语法252
9.2 导入一个或多个成员254
9.3 导入并重命名成员255
9.4 导入时隐藏类257
9.5 导入静态成员258
9.6 无处不在的导入语句260
9.7 导入given262
第10章 函数式编程265
10.1 使用函数字面量(匿名函数)272
10.2 将函数作为变量传递275
10.3 将函数作为方法的参数280
10.4 声明高阶函数282
10.5 使用部分应用函数285
10.6 创建返回函数的方法288
10.7 创建偏函数291
10.8 实现函数式错误处理295
10.9 实际案例:在算法中传递函数298
10.10 实际案例:函数式领域建模300
第11章 集合:介绍308
11.1 选择合适的集合类314
11.2 集合的性能对比319
11.3 不可变集合与可变变量322
11.4 创建惰性视图323
第12章 集合:序列类326
12.1 Vector328
12.2 创建并填充List330
12.3 List的添加操作333
12.4 List和ListBuffer的删除操作335
12.5 使用ListBuffer创建可变列表337
12.6 LazyList338
12.7 ArrayBuffer340
12.8 Array和ArrayBuffer的删除操作342
12.9 创建并更新数组344
12.10 创建多维数组347
12.11 数组排序350
第13章 集合:常见的序列方法353
13.1选择合适的集合方法355
13.2 foreach方法362
13.3 迭代器364
13.4 zipWithIndex和zip方法368
13.5 map方法370
13.6 flatten方法373
13.7 filter方法375
13.8 从集合中提取元素序列378
13.9 序列的拆分380
13.10 reduce和fold方法382
13.11 序列的去重387
13.12 序列的合并388
13.13 序列的随机化391
13.14 集合排序392
13.15 mkString和addString方法397
第14章 集合:映射400
14.1 创建和使用映射400
14.2选择合适的映射403
14.3 不可变映射的添加、更新和删除操作406