描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121402722
√ 本书作者Martin Odersky教授2001年率领团队开发了Scala语言、类库和编译器,其核心成员精心编写了这本官方教程。
√ Java之父James Gosling说过“如果让我在Java之外选一门语言,我会选Scala”,它是面向对象与函数式编程的完美融合。
√ 本书全面涵盖整个编程语言、重要类库及其背后理念,经多版本迭代优化后,编排、组织和示例设置堪称语言学习典范。
√ 第4版大幅增加新内容,覆盖Scala 2.13新特性并重塑集合类库:集合类继承关系|集合类型实现|集合方法|自定义|视图。
本书由直接参与 Scala 开发的一线人员编写,因而对原理的解读和对应用的把握更加值得信赖。本书面向具有一定编程经验的开发者,目标是让读者能够全面了解和掌握 Scala 编程语言的核心特性,并能够深入理解 Scala 这门语言在设计取舍背后的动因。即便是不直接使用Scala 的读者或非一线编程从业者,也能从本书中学到大量关于函数式和面向对象的编程概念和技巧。
序 ……………………………………………………………………………………………XXII
致谢 ………………………………………………………………………………………..XXIV
引言 ……………………………………………………………………………………….XXVII
第1章 一门可伸缩的语言 ………………………………………………………………..1
1.1 一门按需伸缩的语言 …………………………………………………………… 2
1.2 是什么让Scala能屈能伸 ……………………………………………………….. 7
1.3 为什么要用Scala …………………………………………………………………11
1.4 Scala寻根 …………………………………………………………………………. 17
1.5 结语 ………………………………………………………………………………… 19
第2章 Scala入门 …………………………………………………………………………20
第1步 使用Scala解释器 …………………………………………………………… 21
第2步 定义变量 ……………………………………………………………………… 22
第3步 定义函数 ……………………………………………………………………… 24
第4步 编写Scala脚本 ………………………………………………………………. 26
第5步 用while做循环;用if做判断 ……………………………………………. 27
第6步 用foreach和for遍历 ……………………………………………………….. 30
结语 ………………………………………………………………………………………… 32
第3章 Scala入门(续) ………………………………………………………………..33
第7步 用类型参数化数组 ………………………………………………………… 33
第8步 使用列表 ……………………………………………………………………… 38
第9步 使用元组 ……………………………………………………………………… 42
第10步 使用集和映射 ……………………………………………………………… 43
第11步 识别函数式编程风格 ……………………………………………………. 48
第12步 从文件读取文本行 ……………………………………………………….. 51
结语 ………………………………………………………………………………………… 55
第4章 类和对象 …………………………………………………………………………..56
4.1 类、字段和方法 ………………………………………………………………… 56
4.2 分号推断 ………………………………………………………………………….. 61
4.3 单例对象 ………………………………………………………………………….. 62
4.4 Scala应用程序 ………………………………………………………………….. 65
4.5 App特质 …………………………………………………………………………… 68
4.6 结语 ………………………………………………………………………………… 68
第5章 基础类型和操作 ………………………………………………………………….69
5.1 一些基础类型 …………………………………………………………………… 69
5.2 字面量 ……………………………………………………………………………… 70
5.3 字符串插值 ………………………………………………………………………. 77
5.4 操作符即方法 …………………………………………………………………… 78
5.5 算术操作 ………………………………………………………………………….. 81
5.6 关系和逻辑操作 ………………………………………………………………… 83
5.7 位运算操作 ………………………………………………………………………. 85
5.8 对象相等性 ………………………………………………………………………. 86
5.9 操作符优先级和结合性 ……………………………………………………… 88
5.10 富包装类 ………………………………………………………………………… 91
5.11 结语……………………………………………………………………………….. 91
第6章 函数式对象 ………………………………………………………………………..93
6.1 Rational类的规格定义 ……………………………………………………….. 93
6.2 构建Rational …………………………………………………………………….. 94
6.3 重新实现toString方法 ………………………………………………………… 96
6.4 检查前置条件 …………………………………………………………………… 97
6.5 添加字段 ………………………………………………………………………….. 98
6.6 自引用 ……………………………………………………………………………..100
6.7 辅助构造方法 …………………………………………………………………..101
6.8 私有字段和方法 ………………………………………………………………..102
6.9 定义操作符 ………………………………………………………………………104
6.10 Scala中的标识符 ……………………………………………………………..106
6.11 方法重载 ………………………………………………………………………..108
6.12 隐式转换 ………………………………………………………………………..111
6.13 注意事项 ………………………………………………………………………..112
6.14 结语 ………………………………………………………………………………112
第7章 内建的控制结构 ………………………………………………………………..114
7.1 if表达式 …………………………………………………………………………..115
7.2 while循环 …………………………………………………………………………116
7.3 for表达式 …………………………………………………………………………119
7.4 用try表达式实现异常处理 ………………………………………………….125
7.5 match表达式 …………………………………………………………………….129
7.6 没有break和continue的日子 ………………………………………………..131
7.7 变量作用域 ………………………………………………………………………134
7.8 对指令式代码进行重构 ……………………………………………………..137
7.9 结语 ………………………………………………………………………………..139
第8章 函数和闭包 ………………………………………………………………………140
8.1 方法 ………………………………………………………………………………..140
8.2 局部函数 ………………………………………………………………………….142
8.3 一等函数 ………………………………………………………………………….144
8.4 函数字面量的简写形式 ……………………………………………………..147
8.5 占位符语法 ………………………………………………………………………147
8.6 部分应用的函数 ………………………………………………………………..149
8.7 闭包 ……………….
译者序
三年过去了。Scala 变了吗?在我看来,Scala 还是那个让人着迷,同时又超级务实的小众语言。但这并不重要,重要的是你找到了它,而它也找到了你。如果你刚接触 Scala,请允许我投来羡慕的眼光,因为从来没有像今天这样,
有这么多优质的学习资源可供选择,而 Scala 也一直在稳定地向业界输出成熟的解决方案和人才。
我还清晰地记得十年前刚上手 Scala,以及三年前引进《Scala 编程》第3版时的内心活动。我的职业生涯,从我接触 Scala 那一天起,就已注定不同。不怕各位看官笑话,Scala 是我现在公司入职的敲门砖,让我从企业开发顺利
过渡到互联网行业。Scala 也伴随我和团队的成长,贡献了大量经住了互联网级别压力考验的代码,其中一些从 6 年前上线到现在,几乎没有做过重大修改,还是最初的设计和实现,跑赢了很多昙花一现的技术栈。
说回《Scala 编程》,跟第 3 版相比,第 4 版增补了 Scala 2.13 的内容,Scala 2.13 中最主要的改动,是为了给 Scala 3 打基础而几乎重写的集合框架。这本书的分量,除 Martin Odersky 的亲自背书和显而易见的篇幅之外,我
认为最值得一提的,是它不仅全面覆盖了 Scala 几乎所有的语言特性,还从语言开发者的视角,向我们介绍了这些语言特性和设计取舍背后的原因,以及要解决的问题。这是《Scala 编程》跟其他林林总总的 Scala 图书最大的区别。从工具和工具书的角度来看,你也许会觉得 :编程语言就是拿来干活儿的,一本编程语言的入门书,当然就是要把怎么用讲明白,让我高效地完成手中的工作,其他都是次要的。这里,我想给读者朋友们分享一个我自己的心得 :语言除了表达(让计算机和其他人类明白),更是思维的载体。学习一门编程语言,局部功利的因素当然有,但更多的,是通过这门语言,拓宽你的知识边界。语言是手段,不是目的。所以,不论你是否从事 Scala 编程工作,希望这本书,都能够带给你不一样的世界和认知。
感谢 Martin Odersky 和他的团队,为我们带来这样一门独特而优美的编程语言 ;感谢电子工业出版社、张春雨编辑,在第 1 版和第 3 版之后,继续引进本书的第 4 版 ;感谢编辑团队和其他幕后工作者的辛勤付出 ;感谢家人无条件的支持和鼓励,我爱你们,你们是我心中的灯塔。
在本书的翻译过程中,译者虽已尽力忠实呈现原著的本意,但毕竟能力有限,问题和疏漏恐难以避免,恳请各位读者批评指正,联系地址 : [email protected] 。
——高宇翔 2020 年于上海
序
那是 2004 年的一天,我才刚开始编程的职业生涯没多久,当我坐下来,选中了这门在当时还没多少人知道的语言时,我根本无从想象,是怎样的探索和发现的旅程在等待着我。
最初,使用 Scala 编程给我的感受跟使用其他语言并没有特别的不同:试错、实验然后发现,误解然后受教。那时,我能获取的学习资料十分有限:没有教程,没有博客,没有能教我的熟手,当然,更没有像《Scala 编程》这样的书可以参考。我有的仅仅是一门语言,各种神奇的新特性,但没有人能完全肯定怎样用是合适的。赋能的同时,也让人无所适从!
我的 Java 程序员背景让我对 Scala 有所准备,但在日常开发中使用 Scala还是很不一样。我记得早期的一次印象深刻的 Scala 编程经历,当时我跟另一个伙伴一起用 Scala 做一个中等规模的项目。项目过程中我决定执行一次重构
操作——我总是能不断发现新的特性和模式,这已经成了常态——然后就是好几轮的编译。每一次编译器都会向我报告错误清单和每个错误的行号,而我每次都会找到对应的代码行,看看是哪里不对,更新代码修复问题(问题通常都
不会消失,而是换个地方出现)。不过每一步,编译器都能直接把我引到问题发生的地方。有时候,我会重复上述的步骤,好几天都没有一次成功的编译。不过当编译错误从 100 条逐步减少到 10 条,然后 1 条,然后 0 条——成功编译——这时我终于能够跑一跑这个经过大力重构的系统。然而,出人意料的是,它竟然能正常工作。作为一个之前只用过 Java、Perl、BASIC、PHP 和 JavaScript 的年轻程序员,我简直无法相信这是真的。
时间来到 2015 年,在我组织的首届 Scala World 大会上,Rúnar Bjarnason在开场主题演讲中提到“约束即解放,自由有束缚”。在这一点上,没有什么比 Scala 编译过程更有说服力 :当程序员知道 scalac 会执行一整套约束检查,
其目的是让我们免于经历运行时错误——最糟糕的一种错误——的痛苦时,会获得解放。这会让程序员在哪怕没有完整的测试套件时,也能充满信心去实验和探索,开启大刀阔斧的改造。
在过去的这些年,我不断地学习 Scala,直到今天还能发现新的可能性、细微差异和不同特性之间有趣的交集。我不知道还有什么其他语言能像 Scala这样经过多年还持续让人陶醉其中。
Scala 即将迎来一次巨变。Scala 的下一个主要版本,Scala 3,其更新幅度将不亚于我 15 年前从 Java 升级到 Scala。日常的 Scala 编程体验大部分还会继续保留,但新的语言特性将交叉融合,并深远地影响 Scala 的方方面面。在本书付印之时,离 Scala 3 被大面积采纳还有几年的时间,Scala 2 在可预见的未来仍是 Scala 事实上的标准版本。
本书所涵盖的 Scala 2 最新版本,2.13,在标准库中引入了全新的集合类库,吸取了大量来自实战的经验教训,以简化为目标做了重新设计,而上一次这种规模的重构要追溯到 Scala 2.8。新的集合将支持交叉编译到 Scala 2 和 Scala 3,使用新集合类库的代码将无疑为下一个十年打好基础。当所有人对下一个版本的 Scala 都充满期待时,不失为入手《Scala 编程》开始学习的良好契机!
——Jon Pretty 2019 年 9 月 12 日 波兰 克拉科夫
引言
本书是 Scala 编程语言的教程,由直接参与 Scala 开发的人来编写。我们的目标是让读者通过本书,能够了解和掌握成为高产的 Scala 程序员需要知道的一切。书中的示例均通过 Scala 2.13.1 编译。
谁读本书
本书主要的目标读者是希望学习如何用 Scala 编程的人。如果你想在你的下一个项目中使用 Scala,那么本书就是为你准备的。除此之外,本书对于那些想要学习新知识从而扩展自己眼界的程序员也同样有益。比方说,如果你是
Java 程序员,阅读本书,你将接触到来自函数式编程领域和高阶面向对象领域的许多概念。我们相信,通过学习 Scala,以及 Scala 背后的观念,你将成为一名更好的程序员。
我们假定你拥有常规的编程知识。尽管 Scala 作为用于入门的编程语言并没有什么不妥,但是这本书并不适用于(从零开始)学习编程。另一方面,阅读本书并不要求某项具体的编程语言的知识。我们当中大部分人都是在 Java 平台上使用 Scala 的,但本书并不假定你了解 Java 本身。不过,我们预期大部分读者都熟悉 Java,因此我们有时会拿 Scala 跟 Java 做对比,帮助这些读者理解它们之间的区别。
如何使用本书
由于本书的主旨是教学,因此我们推荐的阅读顺序是从前到后,依次阅读各章。我们尽可能每次只引入一个主题,同时只用已经介绍过的主题来解释这个新的主题。因此,如果跳过前面的章节,你也许会遇到某些并不十分理解的
概念。只要按顺序阅读,你会发现掌握 Scala 是循序渐进、顺理成章的。如果你看到某个不明白的词汇,记着查看词汇表和索引。许多读者都喜欢快速浏览特定的章节,这没有问题,词汇表和索引能帮助你随时找回阅读的坐标和方位。
当你读完本书以后,还可以继续将其当作语言参考。Scala 编程语言有一份正式的语言规范,但语言规范强调的是精确,而不是可读性。虽然本书不会覆盖 Scala 的每一个细节,它也足够全面,应该能够在你逐渐成为 Scala 编程
能手的过程中,承担起语言参考书的职责。
如何学习Scala
通读本书,可以学到很多关于 Scala 的知识。不过,如果你做一些额外的尝试,则可以学得更快,更彻底。
首先,可以利用好包含在本书中的代码示例。手动将这些示例录入,有助于在脑海中逐行过一遍代码。尤其是录入过程中尝试一些变化,会非常有趣,这也能让你确信自己真的理解了它们背后的工作原理。
其次,时常访问在线论坛。这样,你和其他 Scala 爱好者可以互相促进。网上有大量的邮件列表、讨论组、聊天室、Wiki 和 Scala 特定主题的订阅。花些时间,找到满足你需求的内容,你会在小问题上花更少的时间,有更多的精力投入到更深入、更重要的问题中。
最后,一旦你读得足够多,则可以自己启动一个编程项目。从头编写小程序,或者为某个更大的项目开发组件。仅仅阅读并不会让你走得更远。
内容概览
第 1 章, “一门可伸缩的语言”,主要介绍 Scala 的设计及背后的概念和历史。
第 2 章,“Scala 入门”,介绍了如何用 Scala 完成一些基础的编程任务,但并不深入讲解它们是如何工作的。本章的目的是让你可以开始键入 Scala 代码并执行。
第 3 章,“Scala 入门(续)”,展示了更多基本的编程任务,帮助你快速上手 Scala。学习完本章以后,你应该就能用 Scala 完成简单的脚本型任务了。
第 4 章,“类和对象”,开始深入介绍 Scala,描述其基本的面向对象的组成部分,并指导大家如何编译并运行 Scala 应用程序。
第 5 章,“基本类型和操作”,介绍了 Scala 基本类型、字面量和支持的操作,(操作符的)优先级和结合性,以及对应的富包装类。
第 6 章,“函数式
《Scala 编程》可能是我读过*好的编程书之一。我喜欢它的写作风格、简明扼要的描述,还有细致入微的讲解。这本书总能在我有某个问题时,适时地给出答案 :它总是先我一步。作者们并不只是简单地秀代码,想当然地认为你
会理解,他们会让你真正明白代码背后的东西。我非常欣赏这一点。
— Ken Egervari,首席软件架构师
《Scala 编程》行文清晰、深入细致、易于理解,示例和提示建议贯穿全书。这本书让我们公司快速高效地掌握了 Scala 这门编程语言。对于想要理解 Scala的灵活性和优雅的程序员来说,这本书非常棒。
— Larry Morroni,公司老板,Morroni Technologies,Inc.
《Scala 编程》是一本非常好的 Scala 入门教材。通读这本书,每一章都构建在之前章节的概念和示例之上,循序渐进,很容易上手。对组成 Scala 的各个语法结构的解释都很深入,会给出示例解释 Scala 与 Java 的不同。除了介绍
语言本身外,还包含了对类库的讲解,比如容器类和 actor 等。我认为这本书非常易读,属于我*近读过的比较好的技术书。真心推荐给所有想要进一步了解 Scala 编程语言的程序员们。
— Matthew Todd
我对《Scala 编程》的作者们付出的努力表示惊叹。这本书对于 Scala 平台(我喜欢这样来称呼)是一个非常有价值的指南 :如何写出更好的代码,如何设计和实现可伸缩的软件架构。如果 2003 年我参与设计和实现 2004 雅典奥
运会门户网站架构时,Scala 像今天这样成熟,或者书桌上有这样一本参考书,该多好!我想对所有的读者说 :不论你有怎样的编程背景,我认为你都会发现Scala 编程是多么舒心、释放潜能,这本书也会成为你探索之旅的良伴。
— Christos KK Loverdos,软件咨询师,研究员
《Scala 编程》非常棒,对 Scala 进行了深入的讲解,同时也是很好的参考书。它会在我的书架上占据显著位置(不过*近去哪儿我都会带上它)。
— Brian Clapper,主席,ArdenTex Inc.
这是一本很棒的书,代码示例和讲解都非常到位。不论编程老手和新手,我都会推荐。
— Howard Lovatt
《Scala 编程》不仅告诉你如何用这门新的编程语言做开发,更重要的是它还告诉你为什么。这本书从务实的角度,向我们介绍将面向对象和函数式编程结合在一起所带来的强大能力,让读者彻底明白 Scala 的真谛。
— Dr. Ervin Varga,CEO/ 创始人,EXPRO I.T. Consulting
对面向对象(OO)程序员而言,这本书很好地介绍了函数式编程。我的首要目标是学习函数式编程(FP),不过在学习过程中我也发现了一些惊喜,比如样例类(case class)和模式匹配(pattern matching)。Scala 是一门有趣的
编程语言,这本书是很好的教程。一本介绍编程语言的书,对于各种细节和背景,讲多讲少,这个度很难拿捏得准。我认为《Scala 编程》在这方面做得非常好。
— Jeff Heon,程序分析师
清晰洞察和技术完整性是任何一本好书的标志性特征,我向本书的作者Martin Odersky、Lex Spoon 和 Bill Venners 表示祝贺!《Scala 编程》从坚实的基础概念开始,将 Scala 用户从入门带到中级并继续往上攀升。对任何想学
习 Scala 编程的人而言,本书都不容错过。
— Jagan Nambi,企业架构师,GMAC Financial Services
《Scala 编程》的阅读体验非常好。对主题的讲解深入、细致、全面,行文精简、优雅。本书的章节组织非常自然,符合逻辑。不论是对于那些对新鲜事物好奇的技术工作者,还是对于那些想要深入理解 Scala 核心功能点和设计的内在动因的专业人士,都同样适用。对于对函数式编程感兴趣的朋友,我强烈推荐这本书。对于 Scala 开发者,这本书是必读的。
— Igor Khlystov,软件架构师 / 主程,Greystone Inc.
《Scala 编程》从头到尾都让人感受到作者在背后付出的巨大心血和精力。在此之前,我从未读到过哪本教程类的书能够兼顾入门和进阶。大部分教程类的书,为了达到看上去易懂(同时不让读者“困惑”)的效果,悄悄地剔除了相关主题中的那些对于当前讨论而言过于高级的知识点。这对于读者体验来说很糟糕,因为我们并不能确切地知道有没有完全理解,理解到什么程度。我们总会觉察到有些残余的、没有被充分解释的“魔法”,而这些是否属实,我们作为读者也无从评判。这本书不会有这种感觉,它从不把任何事当作理所当然:任何细节,要么在当前章节充分解释,要么清楚地指出在后续哪一个章节会详细介绍。的确,本书的文字交叉引用非常多,索引也非常全,因此,当我们想
要在脑海里构建出对某个复杂主题的全貌时,也就相对容易多了。
— Gerald Loeffler,企业级 Java 架构师
在当今这个编程好书稀缺的时代,由 Martin Odersky、Lex Spoon 和 Bill Venners 共同撰写的《Scala 编程》,这本面向中级程序员的介绍类图书格外引人注目。在这里,你能找到关于 Scala 这门语言你所需要知道的一切。
— Christian Neukirchen
评论
还没有评论。