书海网短评:
适读人群:本书适合有一定Java编程经验、对Scala感兴趣,并希望尽快掌握Scala核心概念和用法的开发者阅读。Scala拥抱函数式编程风格,又没有抛弃面向对象的编程范式,可以编写出比Java更精简的程序。由于运行
Scala拥抱函数式编程风格,又没有抛弃面向对象的编程范式,可以编写出比Java更精简的程序。由于运行在JVM之上,可访问任何Java类库,能跟Java框架互操作,也更容易地发挥并发编程的威力。
《快学Scala(第2版)》介绍Scala那些能让你快速上手干活儿的核心概念和技巧,却并不试图穷举所有语言特性,也不会用冗长、过于机巧的示例来,而是仔细斟酌例子和练习,按照清晰定义的能力层级指引你成为专家。
*快速熟悉Scala解释器、语法、工具和独有的使用习惯
*掌握核心语言特性:函数、数组、映射、元组、包、引入、异常处理等
*熟悉Scala面向对象编程:类、继承和特质
*使用Scala处理现实世界的编程任务:操作文件、正则表达式和XML
*使用高阶函数和功能强大的Scala集合类库
*利用Scala强大的模式匹配和样例类
*利用Scala的future构建并发程序
*实现领域特定语言
*理解Scala类型系统
*应用高级的“强力工具”,如注解、隐式转换和隐式参数、类型类等
Scala是一门主要以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程语言的*佳特性结合在一起的编程语言。你可以使用Scala编写出更加精简的程序,同时充分利用并发的威力。由于Scala默认运行于JVM之上,因此它可以访问任何Java类库并且与Java框架进行互操作。通过ScalaJS项目,Scala还可以被编译成JavaScript代码,让我们更便捷高效地开发Web应用。《快学Scala(第2版)》从实用角度出发,给出了一份快速的、基于代码的入门指南。Horstmann以“博客文章大小”的篇幅介绍了Scala的概念,让你可以快速地掌握和应用。实际上手的操作,清晰定义的能力层次,从初级到专家级,全程指导。适合有一定的Java编程经验、对Scala感兴趣,并希望尽快掌握Scala核心概念和用法的开发者阅读。
CayS.Horstmann是《Java核心技术》卷1和卷2第10版(PrenticeHall出版社2016年出版)的作者,此外,他还著有其他十多本面向专业程序员和计算机科学专业学生的书籍。他是SanJose州立大学计算机科学专业的教授,同时也是一位JavaChampion。
高宇翔,资深软件开发工程师和系统架构师,同时也是Scala在国内的早期布道者和实践者,曾译有《快学Scala》(第1版)和《Scala编程》等专业书籍。
目 录
译者序V
第1版序XVII
前言XIX
作者简介XXIII
第1章 基础A11
1.1 Scala解释器1
1.2 声明值和变量4
1.3 常用类型5
1.4 算术和操作符重载7
1.5 关于方法调用8
1.6 apply方法9
1.7 Scaladoc11
练习16
第2章 控制结构和函数A119
2.1 条件表达式20
2.2 语句终止22
2.3 块表达式和赋值22
2.4 输入和输出23
2.5 循环25
2.6 高级for循环27
2.7 函数28
2.8 默认参数和带名参数L129
2.9 变长参数L129
2.10 过程31
2.11 懒值L131
2.12 异常32
练习35
第3章 数组相关操作A139
3.1 定长数组39
3.2 变长数组:数组缓冲40
3.3 遍历数组和数组缓冲41
3.4 数组转换42
3.5 常用算法44
3.6 解读Scaladoc45
3.7 多维数组47
3.8 与Java的互操作48
练习49
第4章 映射和元组A153
4.1 构造映射53
4.2 获取映射中的值54
4.3 更新映射中的值55
4.4 迭代映射56
4.5 已排序映射57
4.6 与Java的互操作57
4.7 元组58
4.8 拉链操作59
练习60
第5章 类A163
5.1 简单类和无参方法63
5.2 带getter和setter的属性64
5.3 只带getter的属性67
5.4 对象私有字段68
5.5 Bean属性L169
5.6 辅助构造器71
5.7 主构造器72
5.8 嵌套类L175
练习78
第6章 对象A181
6.1 单例对象81
6.2 伴生对象82
6.3 扩展类或特质的对象83
6.4 apply方法84
6.5 应用程序对象85
6.6 枚举86
练习87
第7章 包和引入A191
7.1 包91
7.2 作用域规则93
7.3 串联式包语句95
7.4 文件顶部标记法95
7.5 包对象96
7.6 包可见性97
7.7 引入97
7.8 任何地方都可以声明引入98
7.9 重命名和隐藏方法99
7.10 隐式引入99
练习100
第8章 继承A1103
8.1 扩展类103
8.2 重写方法104
8.3 类型检查和转换105
8.4 受保护字段和方法106
8.5 超类的构造106
8.6 重写字段107
8.7 匿名子类109
8.8 抽象类109
8.9 抽象字段110
8.10 构造顺序和提前定义L3110
8.11 Scala类继承关系112
8.12 对象相等性L1114
8.13 值类L2116
练习117
第9章 文件和正则表达式A1121
9.1 读取行121
9.2 读取字符122
9.3 读取词法单元和数字123
9.4 从URL或其他源读取124
9.5 读取二进制文件124
9.6 写入文本文件124
9.7 访问目录125
9.8 序列化125
9.9 进程控制A2126
9.10 正则表达式129
9.11 正则表达式组130
练习131
第10章 特质A1135
10.1 为什么没有多重继承135
10.2 当作接口使用的特质137
10.3 带有具体实现的特质138
10.4 带有特质的对象139
10.5 叠加在一起的特质140
10.6 在特质中重写抽象方法141
10.7 当作富接口使用的特质142
10.8 特质中的具体字段143
10.9 特质中的抽象字段144
10.10 特质构造顺序145
10.11 初始化特质中的字段147
10.12 扩展类的特质148
10.13 自身类型L2149
10.14 背后发生了什么151
练习152
第11章 操作符A1157
11.1 标识符157
11.2 中置操作符158
11.3 一元操作符159
11.4 赋值操作符160
11.5 优先级161
11.6 结合性162
11.7 apply和update方法162
11.8 提取器L2164
11.9 带单个参数或无参数的提取器L2166
11.10 unapplySeq方法L2167
11.11 动态调用L2167
练习171
第12章 高阶函数L1175
12.1 作为值的函数175
12.2 匿名函数177
12.3 带函数参数的函数178
12.4 参数(类型)推断179
12.5 一些有用的高阶函数180
12.6 闭包181
12.7 SAM转换182
12.8 柯里化183
12.9 控制抽象185
12.10 return表达式186
练习187
第13章 集合A2191
13.1 主要的集合特质192
13.2 可变和不可变集合193
13.3 序列195
13.4 列表196
13.5 集197
13.6 用于添加或去除元素的操作符198
13.7 常用方法201
13.8 将函数映射到集合203
13.9 化简、折叠和扫描A3205
13.10 拉链操作209
13.11 迭代器210
13.12 流A3211
13.13 懒视图A3213
13.14 与Java集合的互操作213
13.15 并行集合215
练习217
第14章 模式匹配和样例类A2221
14.1 更好的switch222
14.2 守卫223
14.3 模式中的变量223
14.4 类型模式224
14.5 匹配数组、列表和元组225
14.6 提取器227
14.7 变量声明中的模式227
14.8 for表达式中的模式229
14.9 样例类229
14.10 copy方法和带名参数230
14.11 case语句中的中置表示法231
14.12 匹配嵌套结构232
14.13 样例类是邪恶的吗233
14.14 密封类234
14.15 模拟枚举235
14.16 Option类型235
14.17偏函数L2236
练习238
第15章 注解A2243
15.1 什么是注解243
15.2 什么可以被注解244
15.3 注解参数245
15.4 注解实现246
15.5 针对Java特性的注解247
15.5.1 Java修饰符247
15.5.2 标记接口248
15.5.3 受检异常249
15.5.4 变长参数249
15.5.5 JavaBeans250
15.6 用于优化的注解250
15.6.1 尾递归.250
15.6.2 跳转表生成与内联252
15.6.3 可省略方法253
15.6.4 基本类型的特殊化254
15.7 用于错误和警告的注解255
练习256
第16章 XML处理A2259
16.1 XML字面量260
16.2 XML节点260
16.3 元素属性262
16.4 内嵌表达式263
16.5 在属性中使用表达式264
16.6 特殊节点类型265
16.7 类XPath表达式266
16.8 模式匹配267
16.9 修改元素和属性268
16.10 XML变换269
16.11 加载和保存270
16.12 命名空间273
练习275
第17章 FutureA2277
17.1 在future中运行任务278
17.2 等待结果280
17.3 Try类281
17.4 回调282
17.5 组合future任务283
17.6 其他future变换286
17.7 Future对象中的方法288
17.8 Promise289
17.9 执行上下文291
练习292
第18章 类型参数L2297
18.1 泛型类298
18.2 泛型函数298
18.3 类型变量界定298
18.4 视图界定300
18.5 上下文界定301
18.6 ClassTag上下文界定301
18.7 多重界定302
18.8 类型约束L3302
18.9 型变304
18.10 协变和逆变点305
18.11 对象不能泛型307
18.12 类型通配符308
练习309
第19章 高级类型L2313
19.1 单例类型313
19.2 类型投影315
19.3 路径316
19.4 类型别名317
19.5 结构类型318
19.6 复合类型319
19.7 中置类型320
19.8 存在类型321
19.9 Scala类型系统322
19.10 自身类型323
19.11 依赖注入325
19.12 抽象类型L3327
19.13 家族多态L3329
19.14 高等类型L3333
练习336
第20章 解析A3341
20.1 文法342
20.2 组合解析器操作343
20.3 解析器结果变换345
20.4 丢弃词法单元347
20.5 生成解析树348
20.6 避免左递归348
20.7 更多的组合子350
20.8 避免回溯352
20.9 记忆式解析器353
20.10 解析器说到底是什么354
20.11 正则解析器355
20.12 基于词法单元的解析器356
20.13 错误处理358
练习359
第21章 隐式转换和隐式参数L3.363
21.1 隐式转换363
21.2 利用隐式转换丰富现有类库的功能364
21.3 引入隐式转换365
21.4 隐式转换规则367
21.5 隐式参数368
21.6 利用隐式参数进行隐式转换370
21.7 上下文界定371
21.8 类型类372
21.9 类型证明374
21.10 @implicitNotFound注解376
21.11 CanBuildFrom解读376
练习379
词汇表381
译 者 序
Scala是一门十分有趣又非常实用的语言,它以JVM为目标环境,将面向对象和函数式编程有机地结合在一起,带来独特的编程体验。
它既有动态语言那样的灵活简洁,同时又保留了静态类型检查带来的安全保障和执行效率,加上其强大的抽象能力,既能处理脚本化的临时任务,又能处理高并发场景下的分布式互联网大数据应用,可谓能缩能伸。
我大约是从2009年开始接触Scala的。在此之前曾做过多年的Java开发,其间也陆陆续续接触过JRuby、Groovy和Python,但没有一门语言能像Scala这样,让我产生持续的兴趣和热情,让我重新感受到学习、思考和解决问题的乐趣。Scala为我开了一扇窗,将我带进了函数式编程的世界,在打破旧有思维模式的同时,让我的整个计算机编程知识体系重组,看待很多技术问题的角度都不一样了。这种感觉,不亚于我前些年接触Linux。
Scala不光是一门值得用心学习的语言,同时也是一门可以直接上手拿来解决实际问题的语言。它跟Java的集成度很高,可以直接使用Java社区大量成熟的技术框架和方案。由于它直接编译成Java字节码,因此我们可以充分利用JVM这个高性能的运行平台为我们提供的便利和保障。
目前国内外已经有很多公司和个人采用Scala来构建其平台和应用。作为JVM上第一个获得广泛成功的非Java语言,Scala正以它独特的魅力吸引着越来越多人的热情投入。
你手里的这《快学Scala(第2版)》,出自《Java核心技术》(CoreJava)的作者CayS.Horstmann。
书中每一章的篇幅都不长,娓娓道来,沁人心脾,适合有一定经验的Java程序员阅读。书中几乎所有Scala相关的核心内容都有涉及,由浅入深,深入浅出,非常适合读者快速上手。《快学Scala(第2版)》是原著第2版,针对Scala2.12版进行了全面更新。
当然了,如果你想要用好Scala,想把它发挥到更高的层次,基本功必须扎实。这《快学Scala(第2版)》讲的都是基本招式,看似平实无华,实则招招受用。对于一线开发人员,《快学Scala(第2版)》非常值得放在案头反复揣摩练习。
广大Scala爱好者们,这是为你们准备的书,希望你们也和我一样,在Scala中找到乐趣,找到归属,你们是我完成《快学Scala(第2版)》翻译的动力。
感谢MartinOdersky和他的团队,为我们带来如此美妙的编程语言;感谢电子工业出版社、张春雨编辑第一时间从国外引进这《快学Scala(第2版)》的第2版;感谢编辑团队和其他幕后工作者的辛勤劳动;最后还要感谢我的家人,感谢你们的理解和支持。
在《快学Scala(第2版)》的翻译过程中,译者虽已尽力将原著的真实意思以符合中文习惯的方式呈现给大家,但毕竟能力有限,问题和疏漏在所难免,恳请各位读者批评指正,联系邮箱:gaoyuxiang.scala@gmail.com。
高宇翔
2017年于上海
第1版序
几年前我和CayHorstmann见面,他告诉我Scala需要一本更好的入门书。当时我自己的书才刚出来,因此我当然要问他觉得我那《快学Scala(第2版)》有哪里不好。他回答说,书很不错,但就是太长了,他的学生们是不会有耐心读完800页的《Scala编程》(ProgramminginScala)的。我认为他说得有一定道理。然后他就开始着力改变这个状况,于是就有了这本《快学Scala》。
看到这《快学Scala(第2版)》终于完成我非常高兴,因为它真切地印证了书名所表达的意思。这是一部快速实用的Scala入门指引,详细解释了Scala到底有什么特别,与Java的区别在哪里,如何克服学习中常见的困难,以及如何编写优质的Scala代码。
Scala是一门具备高度表达能力且十分灵活的语言。它让类库编写者们可以使用非常精巧的抽象,以便类库的使用者们可以简单地、直观地表达自己。因此,根据代码种类的不同,它可以很简单,也可以很复杂。
一年前,我曾试着通过一组用于Scala及其标准类库的层级定义来对这个问题做一些澄清。首先按应用程序开发人员和类库设计者分开,然后各自又分为三个层级。初级的内容可以很快被掌握并且足够用于产出实际代码。中级的内容可以使程序变得更加精简、更加函数式,并且可以让类库使用起来更加灵活。而最高级的内容是为那些解决特定问题、处理特定任务的专家准备的。当时我这样写道:
我希望这个层级划分有助于让Scala的初学者决定以怎样的顺序来学习,并且能够给教师和书籍作者一些建议,以怎样的顺序来呈现相关内容。
Cay的书是第一本系统化地采纳这个想法的Scala入门书。每一章都相应地打上了层级标签,让你一目了然地知道该章的难易程度,以及它是面向类库编写者的还是面向应用程序开发人员的。
如你所预期的那样,开始的章节是对基本的Scala功能的快速介绍。不过《快学Scala(第2版)》并不就此收手,接下来还涵盖了许多“高级”概念,直到最后非常高端的内容,这些内容通常并不会出现在编程语言的入门指引当中,比如如何编写解析器组合子,如何使用定界延续,等等。Cay令人钦佩地做到了让哪怕是最高级的概念理解起来也那么简单明了。
我非常喜欢《快学Scala》的构思,于是向Cay和他的编辑GregDoench提出能否将《快学Scala(第2版)》基础章节部分作为免费资料放在Typesafe网站上供大家下载。他们大方地答应了我的请求,对此我深表感谢。这样一来,每个人都可以很快地获取到这份在我看来是目前市面上最紧凑的Scala入门指南。
MartinOdersky
2012年1月
前 言
Java和C++的进化速度已经大不如前,那些乐于使用更现代的语言特性的程序员们正在将眼光移向他处。Scala是一个很有吸引力的选择;事实上,在我看来,对于想要提升生产效率的程序员而言,Scala是最具吸引力的一个。Scala的语法十分简洁,相比Java的样板代码,Scala让人耳目一新。Scala运行于Java虚拟机之上,让我们可以使用海量现成的类库和工具。Scala并非只以Java虚拟机作为目标平台。ScalaJS项目产出的是JavaScript代码,让你用一门不是JavaScript的语言同时编写Web应用的服务端和客户端。它在拥抱函数式编程的同时,并没有废弃面向对象,使你得以逐步了解和学习一种全新的编程范式。Scala解释器让你快速运行实验代码,这使得学习Scala的过程颇为轻松惬意。最后,同时也是很重要的一点是,Scala是静态类型的,编译器能够帮助我们找出大部分错误,这样就不至于要等到程序运行起来以后才发现(或未发现)这些错误,造成时间上的浪费。
《快学Scala(第2版)》是写给那些对于立即开始Scala编程有急切渴望的读者的。我假定你懂Java、C#或C++,并且我也不会去解释变量、循环或类这些基本概念。我不去穷举Scala的所有特性,不会宣传某一种范式比另一种更优越,也不会用冗长的、过于机巧的示例来“折磨”你。与此相反,你将会以紧凑的篇幅得到你想要的信息,可以根据需要选择阅读和复习。
Scala是一门内容很丰富的语言,不过你并不需要知道它的所有细节,就已经可以有效地使用了。Scala的创始人MartinOdersky对应用程序开发工程师和类库设计人员所需的专业知识技能的层级进行了定义。
对每一章(偶尔也针对特定的小节),我都标出了所需的经验层级,大致的递进顺序是:A1、L1、A2、L2、A3、L3。就算你不打算设计自己的类库,知道Scala向类库设计人员提供了哪些工具对于更有效地使用类库也会大有裨益。
这是《快学Scala(第2版)》的第2版,针对Scala2.12做了全面的更新。我添加了对新近的Scala功能特性如字符串插值、动态调用、隐式类和future的介绍,并更新了所有章节来反映当下的Scala用法。
我希望你通过《快学Scala(第2版)》享受到学习Scala的乐趣。如果你发现了错误或者有任何改进建议,请访问http://horstmann.com/scala并留言。在那里,你也能找到指向包含《快学Scala(第2版)》全部代码示例的打包文件的链接。
在此特别感谢DmitryKirsanov和AlinaKirsanova将我的手稿从XHTML转换成如此漂亮的排版样式,让我可以将注意力集中在内容而不是在格式调整上。每个作者都应享受这种待遇!
参与《快学Scala(第2版)》审稿的人员有:AdrianCumiskey、MikeDavis、RobDickens、SteveHaines、SusanPotter、DanielSobral、CraigTataryn、DavidWalend和WilliamWheeler。
非常感谢你们的评价和建议!
最后,一如既往,感谢我的编辑GregDoench,感谢他对我撰写《快学Scala(第2版)》的鼓励和贯穿于整个过程当中的洞察力。
CayS.Horstmann
2016年于旧金山
读者服务
轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达《快学Scala(第2版)》页面。
■提交勘误:您对书中内容的修改意见可在提交勘误处提交,若被采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用来抵扣相应金额)。
■交流互动:在页面下方读者评论处留下您的疑问或观点,与我们和其他读者一同学习交流。
页面入口:http://www.broadview.com.cn/31995









