编辑推荐
IT行业正拥抱函数式编程,但面向对象编程经验仍然极富价值。Scala编程语言结合了面向对象编程和函数式编程这两种编程范式的原力,而本书将展示如何有效地结合这两者。
自本书首版出版以来, Scala编程语言已经取得了长足的发展, 这一版在此基础上也进行了大幅更新。我们修订了每一章,并添加了3章零6节的新内容来探讨Scala 2.12的新特性。读者将学到如何使用并发集合和Akka的Actor来安全地管理并发,使用值类和改进后的隐式转换来创建富有表现力和可读性的代码,使用字符串插值来从数据构建字符串,创建领域特定语言,以及使用尾调用优化来优化递归。
无论读者是要创建简洁、健壮的单线程应用程序,还是要编写非常具有表现力、线程安全的并发程序,本书都是读者的良师益友。
内容介绍
本书是为想要快速学习或者正在学习Scala编程语言的Java开发者写的,循序渐进地介绍了Scala编程语言的多个方面。 本书共分为4个部分:第一部分详细介绍Scala的一些基础知识,并和Java中的相关概念进行了参照,方便读者快速上手Scala;第二部分进一步介绍Scala的一些中级知识,以及与Java的一些差异点,方便读者编写出更简洁的代码;第三部分介绍在Scala中如何进行并发编程,并务实地介绍Akka套件;第四部分通过实战练习对前面的知识进行综合应用,并系统地介绍如何与Java进行互操作。此外,附录部分还包括一些额外指引。 本书的目标读者是对JVM平台上的语言以及函数式编程感兴趣的程序员。阅读本书不需要读者熟悉Scala编程语言,但需要读者具备Java、面向对象编程的背景知识。因为本书以一种非常务实的方式组织内容,所以读者无法学到Scala的所有内容,但是足以应付日常工作,如果想要更全面地学习Scala以及其背后的一些设计理念,则最好辅以其他图书。
作者介绍
作者简介 文卡特·苏帕拉马尼亚姆(Venkat Subramaniam)博士 Agile Developer公司的创始人,同时也在休斯敦大学兼任教职。他已经培训和指导了数千名软件开发者。他也是多本书籍的(合著)作者,其中包括获得2007年度Jolt“生产力大”(Productivity Award)的《高效程序员的45个习惯:敏捷开发修炼之道》一书。 译者简介 沈达 挖财大数据研发工程师, Scala 爱好者与实践者, 专注于大数据和分布式系统。业余时间是GNU TeXmacs的贡献者。 何品 目前是*的一名知名软件工程师,热爱反应式编程,同时也是Akka和Netty等项目的贡献者,活跃于Scala社区。
目录
- 第 一部分 小试牛刀 1
- 第 1章 探索Scala 3
- 1.1 Scala的特性 3
- 1.2 以少胜多 4
- 1.3 函数式编程 8
- 1.4 小结 11
- 第 2章 体验Scala 12
- 2.1 使用REPL 12
- 2.2 命令行上的Scala 14
- 2.3 以独立脚本方式运行Scala代码 15
- 2.3.1 在类Unix系统上以独立脚本方式运行 15
- 2.3.2 在Windows上以独立脚本方式运行 16
- 2.3.3 Scala的IDE支持 16
- 2.4 编译Scala 17
- 2.5 小结 17
- 第3章 从Java到Scala 18
- 3.1 Scala:简洁的Java 18
- 3.1.1 减少样板代码 18
- 3.1.2 更多便利特性 19
- 3.1.3 转向函数式风格 21
- 3.2 Java原始类型对应的Scala类 21
- 3.3 元组和多重赋值 22
- 3.4 灵活的参数和参数值 24
- 3.4.1 传递变长参数值 24
- 3.4.2 为参数提供默认值 25
- 3.4.3 使用命名参数 26
- 3.5 隐式参数 27
- 3.6 字符串和多行原始字符串 29
- 3.7 字符串插值 30
- 3.8 合理的约定 32
- 3.9 操作符重载 33
- 3.10 Scala与Java的差异 35
- 3.10.1 赋值的结果 36
- 3.10.2 Scala的== 36
- 3.10.3 可有可无的分号 37
- 3.10.4 避免显式return 38
- 3.11 默认访问修饰符 39
- 3.11.1 定制访问修饰 39
- 3.11.2 Scala的protected 40
- 3.11.3 细粒度的访问控制 41
- 3.12 小结 43
- 第4章 处理对象 44
- 4.1 创建并使用类 44
- 4.1.1 创建实例 44
- 4.1.2 创建类 45
- 4.1.3 定义字段、方法和构造器 46
- 4.2 遵循JavaBean惯例 49
- 4.3 类型别名 50
- 4.4 扩展一个类 51
- 4.5 参数化类型 52
- 4.6 单例对象和伴生对象 54
- 4.6.1 单例对象 54
- 4.6.2 独立对象和伴生对象 56
- 4.6.3 Scala中的static 57
- 4.7 创建枚举类 59
- 4.8 包对象 60
- 4.9 小结 63
- 第5章 善用类型 64
- 5.1 类型推断 64
- 5.1.1 简单类型的类型推断 64
- 5.1.2 针对泛型和集合的类型推断 66
- 5.2 基础类型 68
- 5.2.1 Any类型 68
- 5.2.2 关于Nothing 69
- 5.2.3 Option类型 70
- 5.2.4 Either类型 71
- 5.3 返回值类型推断 73
- 5.4 参数化类型的型变 75
- 5.4.1 协变和逆变 75
- 5.4.2 支持协变 76
- 5.4.3 支持逆变 77
- 5.4.4 定制集合的型变 78
- 5.5 隐式类型转换 78
- 5.5.1 隐式函数 79
- 5.5.2 隐式类 81
- 5.6 值类 83
- 5.7 使用隐式转换 86
- 5.8 小结 88
- *二部分 深入Scala 89
- 第6章 函数值和闭包 91
- 6.1 常规函数的局限性 91
- 6.2 可扩展性与高阶函数 92
- 6.3 具有多个参数的函数值 93
- 6.4 柯里化 96
- 6.5 参数的占位符 97
- 6.6 参数路由 98
- 6.7 复用函数值 99
- 6.8 部分应用函数 101
- 6.9 闭包 102
- 6.10 Execute Around Method模式 103
- 6.11 小结 106
- 第7章 特质 107
- 7.1 理解特质 107
- 7.2 选择性混入 110
- 7.3 使用特质实现装饰器模式 111
- 7.4 特质中的方法延迟绑定 113
- 7.5 小结 115
- 第8章 集合 116
- 8.1 常见的Scala集合 116
- 8.2 使用Set 118
- 8.3 关联映射 119
- 8.4 不可变列表 121
- 8.5 方法名约定 124
- 8.6 for表达式 126
- 8.7 小结 128
- 第9章 模式匹配和正则表达式 129
- 9.1 模式匹配综述 129
- 9.1.1 匹配字面量和常量 129
- 9.1.2 匹配通配符 130
- 9.1.3 匹配元组和列表 131
- 9.1.4 匹配类型和守卫 132
- 9.2 case表达式中的模式变量和常量 133
- 9.3 使用case类进行模式匹配 135
- 9.4 提取器和正则表达式 138
- 9.4.1 使用提取器进行模式匹配 138
- 9.4.2 正则表达式 141
- 9.4.3 正则表达式作为提取器 142
- 9.5 无处不在的下划线字符 143
- 9.6 小结 144
- 第 10章 处理异常 145
- 10.1 Scala中的异常 145
- 10.2 注意catch的顺序 147
- 10.3 小结 149
- 第 11章 递归 150
- 11.1 一个简单的递归 150
- 11.2 尾调用优化(TCO) 151
- 11.2.1 常规递归并无优化 152
- 11.2.2 用尾调用优化来拯救 152
- 11.2.3 确保尾调用优化 154
- 11.3 蹦床调用 155
- 11.4 小结 158
- 第三部分 Scala中的并发编程 159
- 第 12章 惰性求值和并行集合 161
- 12.1 释放惰性 161
- 12.2 释放严格集合的惰性 164
- 12.3 终*惰性流 167
- 12.4 并行集合 170
- 12.4.1 从顺序集合入手 171
- 12.4.2 使用并行集合加速 173
- 12.5 小结 175
- 第 13章 使用Actor编程 176
- 13.1 一个顺序耗时问题 176
- 13.2 曲折的并发之路 178
- 13.3 创建Actor 179
- 13.4 Actor和线程 181
- 13.5 隔离可变性 182
- 13.6 使用Actor模型进行并发 186
- 13.7 使用建议 189
- 13.8 小结 190
- 第四部分 Scala实战 191
- 第 14章 和Java进行互操作 193
- 14.1 在Scala中使用Scala类 193
- 14.2 在Scala中使用Java类 195
- 14.3 在Java中使用Scala方法 197
- 14.4 在Java中使用特质 198
- 14.5 在Java中使用单例对象和伴生对象 201
- 14.6 扩展类 203
- 14.7 小结 204
- 第 15章 使用Scala创建应用程序 205
- 15.1 获取用户输入 205
- 15.2 读写文件 206
- 15.3 XML作为一等公民 207
- 15.4 读写XML 210
- 15.5 从Web获取股票价格 213
- 15.6 编写并发的资产净值应用程序 216
- 15.7 小结 217
- 第 16章 单元测试 218
- 16.1 使用JUnit 218
- 16.2 使用ScalaTest 220
- 16.3 使用Mockito 221
- 16.3.1 函数式风格的测试 221
- 16.3.2 创建一个Mock 223
- 16.4 小结 227
- 附录A 安装Scala 228
- 参考文献 230