Scala程序设计(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-21 08:43:57

点击下载

作者:万普勒(Dean Wampler)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Scala程序设计(第2版)

Scala程序设计(第2版)试读:

前言

《Scala 程序设计》向读者介绍了一门既令人振奋又功能强大的语言,该门语言集合了现代对象模型、函数式编程以及先进类型系统的所有优点,同时又能应用获得产业界大量投资的 Java 虚拟机(JVM)。这本书通过大量的代码示例,向读者全面阐述了如何使用 Scala 迅速编写代码,解释了为什么 Scala 是编写可扩展、分布式、基于组件且支持并发和分布的应用程序的最完美语言。Scala 运行在先进的 JVM 平台之上,通过阅读本书,读者还能了解到 Scala 是如何发挥 JVM 平台优势的。

如果你想了解更多内容,请访问 http://programming-scala.org 或查阅本书目录(http://shop.oreilly.com/product/0636920033073.do)。欢迎阅读《Scala程序设计(第2版)》

本书第1版出版于2009年秋,是当时市面上第三本讲述 Scala 的图书,仅仅因为耽误了几个月,未能成为第二本。Scala 当时的官方版本号为2.7.5,而2.8.0版则接近完工。

从那时起,Scala 世界发生了巨大的变化。编写本书时,Scala 的版本号为2.11.2。为了进一步提升 Scala 语言以及相关工具,Scala 的创建者 Martin Odersky 与基于 actor 模型的并发框架 Akka 的作者 Jonas Bonér 一同创立了 Typesafe(http://typesafe.com)公司。

现在已经出版了很多 Scala 的图书,我们真的有必要再推出第2版吗?市场上现存不少适合初学者的 Scala 指南,也出现了一些供高级学习者使用的图书,由 Artima 出版 Odersky 等人撰写的《Scala 编程(第2版)》仍被视为 Scala 语言的百科全书。

然而,本书第2版非常完整地描述了 Scala 语言及其生态系统,既为初学者成为 Scala 高级用户提供了所需要的指导,又关注了开发人员所面对的实用性问题,这是本书独一无二的地方,也是第1版广受欢迎的原因所在。

与2009年相比,现在有更多的机构选用了 Scala,大多数 Java 开发者也都听说过这门语言。同时,也出现了一些针对 Scala 语言的持续质疑。Scala 是不是太复杂了?既然 Java 8已经引入了一些 Scala 特性,那还有必要使用 Scala 吗?

对于真实世界中的种种质疑,我将一一解答。我常常说,Scala 的一切,包括它的不足之处,都让我为之着迷。我希望读者阅读完本书也会有同感。如何阅读本书

本书论述全面,初级读者无须阅读所有内容便可以使用 Scala 进行编程。本书的前3章“零到六十:Scala 简介”“更简洁,更强大”和“要点详解”,简要概括了 Scala 的核心语言特性。 第4章“模式匹配”和第5章“隐式详解”描述了使用 Scala 编程时每天都会用到的两类基本工具,通过对这两类工具的描述将读者引领到更深的领域里。

函数式编程(FP)是一种重要的软件开发方案,假如你之前从未接触过 FP,那么阅读第6章能通过 Scala 学习函数式编程。紧接着第7章,将说明 Scala 对 for 循环的扩展,以及如何使用该扩展提供的简洁语法实现复杂而又符合规范的函数式代码。

之后,第8章将介绍 Scala 是如何支持面向对象编程(OOP)的。为了强调 FP 对于解决软件开发问题的重要性,我将 FP 相关章节放到 OOP 章节之前。如果将 Scala 当作“更好的面向对象的 Java”,那会较容易上手,但这样会丢掉这门语言最有力的工具。第8章的大多数内容在概念上很容易理解,读者将学到在 Scala 中如何定义类、构造函数等与 Java 相似的概念。

第9章将继续探索 Scala 的功能——使用 trait 对行为进行封装。Java 8受到了 Scala trait 机制的影响,通过对接口进行扩展,新增了部分 trait 功能。对于这部分内容而言,即便是有经验的 Java 程序员也需要花时间理解。

接下来的4章,从第10章到第13章,“Scala 对象系统(I)”“Scala 对象系统(II)”“Scala 集合库”以及“可见性规则”,详细地讲解了 Scala 的对象模型和库类型。由于第10章包含了一些必须要尽早掌握的基本知识,因此阅读时要务必仔细。第11章讲述了如何正确地实现普通类型层次,你可以在第一遍阅读本书时略过这一章。第12章讨论了集合设计问题并提供了合理使用集合的相关信息。再重申一遍,假如你初次接触 Scala,那么请先略过此章,当你试图掌握集合类 API 的详细内容时,再回来学习。最后,第13章详细解释了 Scala 是如何对 Java 的 public、protected 以及 private 可见性概念进行细粒度扩展的。可以快速阅览此章。

从第14章开始,我们将进入更高级的主题:Scala 复杂类型。这部分内容划分为两章:第14章包含了 Scala 新手相对容易理解的概念,而第15章则讲述了更高级的内容,你可以选择以后再进行阅读。

类似地,第16章“高级函数式编程”讲述的内容中包括了更多高级的理论概念,例如,Monad 和仿函式(Functor)这些起源于范畴论的概念。一般水平的 Scala 开发者在最初并不需要掌握这些内容。

第17章“并发工具”有助于开发大型服务的程序员实现并发性的可伸缩性和可扩展性。这一章既论述了 Akka 这一基于 actor 的富并发模型,又讲述了像 Future 这类有助于编写异步代码的库类型。

第18章“Scala 与大数据”,通常而言,在大数据以及其他以数据为中心的计算领域里,应用 Scala 和函数式编程能够构造杀手级应用。

第19章“Scala 动态调用”和第20章“Scala 的领域特定语言”是较为高级的专题,探讨了可用于构建富领域特定语言的一些工具。

第21章“Scala 工具和库”讨论了一些 IDE 和第三方库。假如你是 Scala 新手,那么请阅读 IDE 和编辑器支持的相关小节,同时阅读关于 Scala 公认的项目构建工具:SBT 的相关小节。本章最后列出了可以引用的库列表。第22章“与 Java 的互操作”对于那些需要互用 Java 和 Scala 代码的团队而言很有帮助。

第23章“应用程序设计”是为架构师和软件组长而写的。我在这一章分享了自己在应用设计方面的一些观点。传统模式使用了相对较大的 JAR 文件,而这些 JAR 文件又包含了复杂的对象图谱。因此我认为这种模式是一种不良模式,需要进行变更。

最后,第24章“元编程:宏与反射”介绍了本书最高级的主题。当然,如果你是初学者,也可以略过这一章。

本书在附录 A 中总结了一些资料,供读者进一步阅读。本书未涉及的内容

模块化库是 Scala 最新的2.11版的一大焦点,它将库文件分解成更小的 JAR 文件,这样一来,在将系统部署到空间受限的环境时(如手机设备),便能很容易移除不需要的代码。除此之外,新版移除了库中一些原本被标示为“过时”(deprecated)的包和类型,还将其他的一些包和类型标示为 deprecated,这通常是因为 Scala 不再维护这些包和类型,而且有更好的第三方的替代品。

因此,我们不会在本书中讨论那些在2.11版本中被标示为 deprecated 的包,具体如下。● scala.actors(http://www.scala-lang.org/api/current/scala-actors/

#scala.actors.package)

一套 actor 库。请使用 Akka actor 库。(我们将在17.3节对该库进

行描述。)● scala.collection.script(http://www.scala-lang.org/api/current/

#scala.collection.script.package)

该库用于编写监控集合以及更新集合相关“脚本”。● scala.text(http://www.scala-lang.org/api/current/

#scala.text.package)

一套用于“格式化打印”(pretty-printing)的库。

下面列举了在 Scala 2.10中标示为 deprecated 并已从2.11版移除的包。● scala.util.automata(http://www.scala-lang.org/api/2.10.4/

#scala.util.automata.package)

使用正则表达式构建确定有限自动机(DFA)。● scala.util.grammar(http://www.scala-lang.org/api/2.10.4/

#scala.util.grammar.package)

属于 parsing 库。● scala.util.logging(http://www.scala-lang.org/api/2.10.4/

#scala.util.logging.package)

推荐使用某一 JVM 平台上活跃的第三方日志库。● scala.util.regexp(http://www.scala-lang.org/api/2.10.4/

#scala.util.regexp.package)

对正则表达式进行句式分析。scala.util.matching 包同样支持正

则表达式,请使用功能更为强大的 scala.util.matching 包。● .NET 编译器后台

Scala 团队曾在 .NET 运行的环境之上搭建编译器后台及库。不

过由于大家对这次迁移的兴趣不断衰减,因此这项工作已经暂

停。

我们不会对 Scala 库中每个包和类型都进行讨论。由于篇幅和其他原因,下面这些包并不会在本书中提及。● scala.swing(http://www.scala-lang.org/api/current/scala-swing/

#scala.swing.package)

对 Java Swing 库进行封装。尽管仍然有人维护该库,但已很少

有人使用它。● scala.util.continuations(http://www.scala-lang.org/files/archive/

api/current/scala-continuations-library/

#scala.util.continuations.package)

编译器插件,用于生成连续传递格式(continuation-passing

style,CPS)的代码。这是一个特殊的工具,目前很少有人使用

它。● App(http://www.scala-lang.org/api/current/#scala.App)和

DelayedInit(http://www.scala-lang.org/api/current/

#scala.DelayedInit)特征

使用这两个类型能很方便地实现 main 类型(入口类型),它们

也是 Java 类中 static main 方法的同义词。不过由于它们有时候

会导致奇怪的行为,因此我并不推荐使用它们。我会使用通用的、

符合规范的 Scala 方法编写 main 方法。● scala.ref(http://www.scala-lang.org/api/current/

#scala.ref.package)

对某些 Java 类型进行了封装,如 WeakReference,这是

java.lang.ref.WeakReference 的封装类。● scala.runtime(http://www.scala-lang.org/api/current/

#scala.runtime.package)

用于实现类库的类型。● scala.util.hashing(http://www.scala-lang.org/api/current/

#scala.util.hashing.package)

提供了多种散列算法。欢迎阅读《Scala程序设计(第1版)》

一门编程语言能够流行起来是有一定原因的。有时候,某一平台的程序员会青睐于某一特定语言或平台提供商所建议的语言。大多数 Mac OS 开发者习惯使用 Objective-C,大多数 Windows 平台开发者使用 C++ 和 .NET 语言,而嵌入式系统开发者则使用 C 和 C++。

有时,语言能流行起来归功于其技术上的优势,这一优势能够使其变得时尚、让人着迷。C++、Java 和 Ruby 便曾引起程序员的狂热崇拜。

有时,语言会因为适应时代的需要而流行起来。Java 最初被视为一门能够用于编写基于浏览器的富客户端应用的完美语言。当面向对象编程变得主流时,Smalltalk 抓住了这一机遇。

现在,并发、异构型、永不停止的服务以及不断缩短的开发计划,使得业内对函数式编程越来越感兴趣。似乎面向对象编程的统治地位即将结束,而混合式编程范式将流行起来,甚至会变得不可或缺。

如今我们构建的应用大多是可靠、高性能、高并发的互联网或企业级应用程序,我们也希望会有一门通用编程语言适应这一要求,Scala 能将我们从其他语言的阵营中吸引过来,便是因为它具备了许多最理想的特性。

Scala 是一门多范式语言,同时支持面向对象和函数式编程。Scala 具有可扩展性,从小脚本到基于组件的大规模应用程序,Scala 均可胜任。Scala 是深奥的,它从全世界的计算机科学系中吸收了先进的思想。Scala 又是实用的,它的创建者 Martin Odesky 参与了多年的 Java 开发,能理解专业开发人员的需求。

Scala 简洁、优雅而又富有表现力的语法,以及提供的众多工具让我们为之着迷。本书力图阐明为什么这些特性会使 Scala 引人注目、不可或缺。

假如你是一位有经验的开发者,希望能快速全面地了解 Scala,那么这本书很适合你。你也许正在思考是否改用 Scala 或将其作为另一门补充语言;抑或你已经决定使用 Scala,需要学习并很好地掌握 Scala 的特性。无论是哪种情况,我们都希望能以一种平易近人的方式阐明这门强大的语言。

我们假设你已经很好地掌握了面向对象的编程,但并没有接触过函数式编程。我们认为你熟悉一门或多门其他的语言。我们对比了 Java、C#、Ruby 等语言的特性,如果你熟悉任何一种语言,会了解 Scala 中的相似特性,以及一些全新特性。

无论你是否具有面向对象或函数式编程的背景,都会了解到 Scala 如何优雅地融合这两种编范式,展示了它们的互补性。基于众多示例,你还能明白针对不同的设计问题如何以及何时应用 OOP 和 FP 技术。

最后,我们希望你也会为 Scala 着迷。即便 Scala 未能成为你日常使用的语言,无论你使用什么语言,我们也希望你能从 Scala 中洞察到些许知识。排版约定

本书使用以下排版约定。● 楷体

表示新术语。● 等宽字体(constant width)

表示程序片段,以及正文中出现的变量、函数名、数据库、数据

类型、环境变量、语句和关键字等。● 加粗等宽字体(constant width bold)

表示应该由用户输入的命令或其他文本。● 倾斜的等宽字体(constant width italic)

表示应该由用户输入的值或根据上下文决定的值替换的文本。 该图标表示提示或建议。 该图标表示一般注记。 该图标表示警告或警示。使用代码示例

本书就是要帮读者解决实际问题的。也许你需要在自己的程序或文档中用到本书中的代码。除非大段大段地使用,否则不必与我们联系取得授权。因此,使用本书中的几段代码写成一个程序不用向我们申请许可。但是,销售或者分发 O'Reilly 图书随附的代码光盘则必须事先获得授权。引用书中的代码来回答问题也无需我们授权。将大段的示例代码整合到你自己的产品文档中则必须经过许可。

使用我们的代码时,希望你能标明它的出处。出处一般要包含书名、作者、出版商和书号,例如:“Programming Scala, Second Edition by Dean Wampler and Alex Payne. Copyright 2015 Dean Wampler and Alex Payne, 978-1-491-94985-6.”

如果还有其他使用代码的情形需要与我们沟通,可以随时通过 permissions@oreilly.com 与我们联系。获得示例代码

读者可以从 GitHub(https://github.com/deanwampler/prog-scala-2nd-ed-code-examples)下载代码示例,并把下载后的文件解压到指定位置。请阅读随示例发布的 README 文件,了解如何构建和使用这些示例。(第1章会对相关指令进行归纳说明。)

一些示例文件可以作为脚本,使用 scala 命令运行,而另外一些则必须编译成 class 文件,还有一些文件本身就包含了故意植入的错误,无法通过编译。为了表明文件类型,我采用了某种特定的文件命名方式。实际上,在学习 Scala 的过程中,你也能从文件内容中发现文件类型。在大多数情况下,本书示例文件遵循下列命名规范。● *.scala

这是 Scala 文件的标准文件扩展名,不过你无法从该扩展名中分

辨该文件是必须使用 scalac 进行编译的源文件,还是可以直接

使用 scala 运行的脚本文件,或者是本书特意植入了错误的无效

代码文件。因此,本书示例代码中使用了 .scala 扩展名的文件必

须单独经过编译才能使用,编译过程与编译 Java 代码相似。● *.sc

以 .sc 后缀结尾的文件可以作为脚本文件,使用 scala 命令运

行。例如:scala foo.sc 命令会执行 foo.sc 脚本。你还可以在解

释模式下启动 scala,并通过 :load 命令加载任意脚本文件。请

注意,使用 .sc 对脚本进行命名并不是 Scala 社区的命名标准,

不过由于 SBT 构建项目时会忽略 .sc 文件,因此我们在此处用

其对脚本进行命名。与此同时,IDE 提供的 worksheet 新功能将

worksheet 文件命名为 .sc 文件,我们会在第1章中讨论这一功能。

所以使用 .sc 对脚本命名是一个可以接受的、便利的命名方法。

再次申明,通常情况下我们使用 .scala 扩展名为脚本文件和代码

命名。● *.scalaX 及 *.scX

某些示例文件中特意植入了某些导致编译异常的错误。为了避免

导致编译出错,这些文件使用了 .scalaX 或 .scX 扩展

名。.scalaX 表示代码文件,而 .scX 则表示脚本文件。再次重

申,.scalaX 和 .scX 扩展名并不是业内使用的扩展名。这些文件

中也嵌入了一些注释,用于说明这些文件无法执行的原因。®Safari Books Online

Safari Books Online(http://www.safaribooksonline.com)是应需而变的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。

Safari Books Online 是技术专家、软件开发人员、Web 设计师、商务人士和创意人士开展调研、解决问题、学习和认证培训的第一手资料。

对于组织团体、政府机构和个人,Safari Books Online 提 供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问 O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology 以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解 Safari Books Online 的更多信息,我们网上见。联系我们

请把对本书的评价和发现的问题发给出版社。

美国:

  O'Reilly Media, Inc.

  1005 Gravenstein Highway North

  Sebastopol, CA 95472

中国:

  北京市西城区西直门南大街2号成铭大厦 C 座807室(100035)

  奥莱利技术咨询(北京)有限公司

O'Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是:

 http://shop.oreilly.com/product/0636920033073.do

对于本书的评论和技术性问题,请发送电子邮件到:

 bookquestions@oreilly.com

要了解更多 O'Reilly 图书、培训课程、会议和新闻的信息,请访问以下网站:

 http://www.oreilly.com

我们在 Facebook 的地址如下:http://facebook.com/oreilly

请关注我们的 Twitter 动态:http://twitter.com/oreillymedia

我们的 YouTube 视频地址如下:http://www.youtube.com/oreillymedia第2版致谢

我,Dean Wampler,在编写这一版书的过程中得到了 Typesafe 公司许多同事的指导和反馈。除此之外,一些审核了早期版本的人也给我提供了有价值的反馈,非常感谢他们。我要特别感谢 Ramnivas Laddad、Kevin Kilroy、Lutz Huehnken 和 Thomas Lockney,他们帮我审阅了本书的底稿。感谢我的老同事、老朋友 Jonas Bonér,感谢他为本书作序。

特别感谢 Ann,允许我将大量的个人时间花在本书的编写工作中,感谢你长期以来对我的包容,我爱你!第1版致谢

我们在编写这本书的时候,一些朋友阅读了早期版本,并对本书的内容提出了大量好的意见,我们在此对这些朋友表示感谢。特别要感谢 Steve Jensen、Ramnivas Laddad、Marcel Molina、Bill Venners 和 Jonas Bonér,他们给本书提供了大量的反馈。

我们在 Safari 发布初稿以及在 http://programmingscala.com 网站上提供在线版本时,收到了大量的反馈。在此列举了提供反馈的读者(排名不分先后),对他们表示感谢。他们是 Iulian Dragos、Nikolaj Lindberg、Matt Hellige、David Vydra、Ricky Clarkson、Alex Cruise、Josh Cronemeyer、Tyler Jennings、Alan Supynuk、Tony Hillerson、Roger Vaughn、Arbi Sookazian、Bruce Leidl、Daniel Sobral、Eder Andres Avila、Marek Kubica、Henrik Huttunen、Bhaskar Maddala、Ged Byrne、Derek Mahar、Geoffrey Wiseman、Peter Rawsthorne、Geoffrey Wiseman、Joe Bowbeer、Alexander Battisti、Rob Dickens、Tim MacEachern、Jason Harris、Steven Grady、Bob Follek、Ariel Ortiz、Parth Malwankar、Reid Hochstedler、Jason Zaugg、Jon Hanson、Mario Gleichmann、David Gates、Zef Hemel、Michael Yee、Marius Kreis、Martin Süsskraut、Javier Vegas、Tobias Hauth、Francesco Bochicchio、Stephen Duncan Jr.、Patrik Dudits、Jan Niehusmann、Bill Burdick、David Holbrook、Shalom Deitch、Jesper Nordenberg、Esa Laine、Gleb Frank、Simon Andersson、Patrik Dudits、Chris Lewis、Julian Howarth、Dirk Kuzemczak、Henri Gerrits、John Heintz、 Stuart Roebuck 以及 Jungho Kim。 还有很多读者也为本书提供了反馈,不过我们只知道他们的用户名,在此我们要向 Zack、JoshG、ewilligers、abcoates、brad、teto、pjcj、mkleint、dandoyon、Arek、rue、acangiano、vkelman、bryanl、Jeff、mbaxter、pjb3、kxen、hipertracker、ctran、Ram R.、cody、Nolan、Joshua、Ajay、Joe 表示感谢。除此之外,我们还要向不知道名字的贡献者表示感谢。如果名单中漏掉了谁,我们在此表示歉意!

Mike Loukides 是我们的编辑,他深知应该如何以温和的方式催促进度。他在我们写书的过程中为我提供了巨大的帮助。O'Reilly 出版社的其他员工也总能回答我们的问题,并帮助我们继续工作。

感谢 Jonas Bonér 为本书作序。Jonas 是我在“面向切面编程”(AOP,Aspect-Oriented Programming)委员会的老朋友、老同事。这些年来,他为 Java 社区做了很多前沿性的工作。现在他将精力投入到了改进 Scala 和发展 Scala 社区的工作中。

Bill Venners 很友善地评论了本书,我们将其置于封底处。他与 Martin Odersky、Lex Spoon 一起编写了第一本 Scala 图书《Scala 编程》。对于 Scala 开发人员而言,他是不可或缺的人物。Bill 同时还创造了令人惊叹的 ScalaTest 库。

除了 Jonas 和 Bill 之外,我们还从世界各地的开发人员处学到了很多,他们是 Debasish Ghosh、James Iry、Daniel Spiewak、David Pollack、Paul Snively、Ola Bini、Daniel Sobral、Josh Suereth、Robey Pointer、Nathan Hamblen、Jorge Ortiz,以及一些通过发表博文、参与论坛讨论以及私人会话给我提供帮助的朋友。

Dean 要向 Object Mentor 公司的同事表示感谢,他同时也要感谢许多客户端开发人员。他们激发了许多编程语言、软件设计以及业内实际问题的讨论。芝加哥地区 Scala 狂热者团体(Chicago Area Scala Enthusiasts,CASE )也为本书提供了很有价值的反馈及激励。

Alex 要向他在 Twitter 的同事表示感谢,他们对 Alex 的工作给予了鼓励,并在实际工作中很好地演示了 Scala 语言的能力。Alex 同时要对湾区 Scala 爱好者(Bay Area Scala Enthusiasts,BASE)表示感谢,他们的激情以及这个社团本身为他提供了帮助。

我们要特别感谢 Martin Odersky 和他的团队,感谢他们创造了 Scala。第1章零到六十:Scala 简介

本章将简要说明 Scala 为何应该受到重视。之后我们将会深入学习 Scala,并动手编写一些代码。1.1 为什么选择Scala

Scala 是一门满足现代软件工程师需求的语言;它是一门静态类型语言,支持混合范式;它也是一门运行在 JVM 之上的语言,语法简洁、优雅、灵活。Scala 拥有一套复杂的类型系统,Scala 方言既能用于编写简短的解释脚本,也能用于构建大型复杂系统。这些只是它的一部分特性,下面我们来详细说明。● 运行在 JVM 和 JavaScript 之上的语言

Scala 不仅利用了 JVM 的高性能以及最优化性,Java 丰富的工

具及类库生态系统也为其所用。不过 Scala 并不是只能运行在

JVM 之上! Scala.js(http://www.scala-js.org)正在尝试将其迁

移到 JavaScript 世界。● 静态类型

在 Scala 语言中,静态类型(static typing)是构建健壮应用系统

的一个工具。Scala 修正了 Java 类型系统中的一些缺陷,此外

通过类型推演(type inference)也免除了大量的冗余代码。● 混合式编程范式——面向对象编程

Scala 完全支持面向对象编程(OOP)。Scala 引入特征(trait)

改进了 Java 的对象模型。trait 能通过使用混合结构(mixin

composition)简洁地实现新的类型。在 Scala 中,一切都是对象,

即使是数值类型。● 混合式编程范式——函数式编程

Scala 完全支持函数式编程(FP),函数式编程已经被视为解决

并发、大数据以及代码正确性问题的最佳工具。使用不可变值、

被视为一等公民的函数、无副作用的函数、高阶函数以及函数集

合,有助于编写出简洁、强大而又正确的代码。● 复杂的类型系统

Scala 对 Java 类型系统进行了扩展,提供了更灵活的泛型以及

一些有助于提高代码正确性的改进。通过使用类型推演,Scala

编写的代码能够和动态类型语言编写的代码一样精简。● 简洁、优雅、灵活的语法

使用 Scala 之后,Java 中冗长的表达式不见了,取而代之的是

简洁的 Scala 方言。Scala 提供了一些工具,这些工具可用于构

建领域特定语言(DSL),以及对用户友好的 API 接口。● 可扩展的架构

使用 Scala,你能编写出简短的解释性脚本,并将其粘合成大型

的分布式应用。以下四种语言机制有助于提升系统的扩展性:

1) 使用 trait 实现的混合结构;2) 抽象类型成员和泛型;3) 嵌套

类;4) 显式自类型(self type)。

Scala 实际上是 Scalable Language 的缩写,意为可扩展的语言。Scala 的发音为 scah-lah,像意大利语中的 staircase(楼梯)。也就是说,两个 a 的发音是一样的。

早在2001年,Martin Odersky 便开始设计 Scala,并在2004年1月20日推出了第一个公开版本(参见 http://article.gmane.org/gmane.comp.lang.scala/17)。Martin 是瑞士洛桑联邦理工大学(EPFL)计算机与通信科学学院的一名教授。在就读研究生时,1Martin 便加入了由 Niklaus Wirth 领导的 PASCAL fame 项目组。Martin 曾任职于 Pizza 项目组,Pizza 是运行在 JVM 平台上早期的函数式语言。之后与 Haskell 语言设计者之一 Philip Wadler 一起转战 GJ。GJ 是一个原型系统,最终演变为 Java 泛型。Martin 还曾受雇于 Sun 公司,编写了 javac 的参考编译器,这套系统后来演化成了 JDK 中自带的 Java 编译器。1PASCAL 之父。——译者注1.1.1 富有魅力的Scala

自从本书第1版出版之后,Scala 用户数量急剧上升,这也证实了我的观点:Scala 适应当前时代。当前我们会遇到很多技术挑战,如大数据、通过并发实现高扩展性、提供高可用并健壮的服务。Scala 语法简洁但却富有表现力,能够满足这些技术挑战。在享受 Scala 最先进的语言特性的同时,你还可以拥有成熟的 JVM、库以及生产工具给你带来的便利。

在那些需要努力才能成功的领域里,专家们往往都需要掌握复杂强大的工具和技术。也许掌握这些工具技能需要花费一些时间,但是掌握它们是你事业成功的关键,所以花费这些时间都是值得的。

我确信对于专家级开发者而言,Scala 就是这样一门语言。并不是所有的用户都能称得上是专家,而 Scala 却是属于技术专家的语言。Scala 包含丰富的语言特性,具有很好的性能,能够解决多种问题。虽然需要花一些时间才能掌握 Scala 语言,但是一旦你掌握了它,便不会被它束缚。1.1.2 关于Java 8

自从 Java 5引入泛型之后,再也没有哪次升级能比 Java 8引入更多的特性了。现在可以使用真正的匿名函数了,我们称之为 Lambda。通过本书你将了解到这些匿名函数的巨大作用。Java 8还改进了接口,允许为声明的方法提供默认实现。这一变化使得我们能够像使用混合结构那样使用接口,这也使接口变得更有用了,而 Scala 则是通过 trait 实现这种用法的。在 Java 8推出之前,Scala 便已为 Java 提供了这两个被公认为 Java 8最重要的新特性。现在是不是能说服自己切换到 Scala 了?

由于 Java 语言向后兼容的缘故,Scala 新增了一些改进,而 Java 也许永远不会包含。即便 Java 最终会拥有这些改进,那也需要漫长的等待。举例来说,较 Java 而言,Scala 能提供更为强大的类型推演、强大的模式匹配(pattern matching) 和 for 推导式(for comprehension),善用模式匹配和 for 推导式能够极大地减少代码量以及类型耦合。随着深入学习,你会发现这些特性的巨大价值。

另外,一些组织对升级 JVM 设施抱有谨慎态度,这是可以理解的。对于他们而言,目前并不允许部署 Java 8虚拟机。为了使用这些 Java 8特性,这些组织可以在 Java 6或 Java 7的虚拟机上运行 Scala。

你也许因为当前使用 Java 8,就认为 Java 8是最适合团队的选择。即便如此,本书仍然能给你传授一些有用的技术,而且这些技术可以运用在 Java 8中。不过,我认为 Scala 具有一些额外的特性,能够让你觉得值得为之改变。

好吧,让我们开始吧!1.2 安装Scala

为了能够尽可能快地安装并运行 Scala,本节将讲述如何安装命2令行工具,使用这些工具便能运行本书列举的所有示例 。本书示例中的代码使用了 Scala 2.11.2进行编写及编译。这也是编写本书时最新的版本。绝大多数代码无须修改便能运行在早期版本2.10.4上,而一些团队也仍在使用这一版本。2第21章会详细讲解这些工具。 相较于2.10,Scala 2.11引入了一些新的特性,不过此次发布更侧重于整体性能的提升以及库的重构。Scala 2.10与2.9版本相比,也引入了一些新的特性。也许你们部门正在使用其中的某一版本,而随着学习的深入,我们会讨论这些版本间最重要的差别。(参阅 http://docs.scala-lang.org/scala/2.11/ 了解2.11版本,参阅 http://www.scala-lang.org/download/2.10.4.html#Release_Notes 了解2.10版本。)

安装步骤如下。● 安装 Java

针对 Scala 2.12之前的版本,你可以选择 Java 6、7、8三个版本,

在安装 Scala 之前,你必须确认你的电脑上已经安装了 Java。(Scala 2.12计划于2016年年初发布,该版本将只支持 Java 8。)

假如你需要安装 Java,请登录 Oracle 的网站(http://

www.oracle.com/technetwork/java/javase/downloads/index.html),

遵循指示安装完整的 Java 开发工具包(JDK)。● 安装 SBT

请遵循 scala-sbt.org(http://www.scala-sbt.org/release/tutorial/

Setup.html)网页上的指示安装 SBT,它是业内公认的构建工具。

安装完成后,便可以在 Linux、OS X 终端和 Windows 命令窗口

中运行 sbt 命令。(你也可以选择其他的构建工具,21.2.2节将介

绍这些工具。)● 获取本书源代码

本书前言中描述了如何下载示例代码。压缩包可以解压到你电脑

中的任何文件夹。● 运行 SBT

打开 shell 或命令行窗口,进入示例代码解压后的目录,敲入命

令 sbt test,该命令会下载所有的依赖项,包括 Scala 编译器及

第三方库,请确保网络连接正常,并耐心等待该命令执行。下载

完毕后,sbt 会编译代码并运行单元测试。此时你能看到很多的

输出信息,该命令最后会输出 success 信息。再次运行 sbt test

命令,由于该命令不需要执行任何事情,你会发现命令很快就结

束了。

祝贺你!你已经真正开始了 Scala 的学习。不过,你也许会想安装其他一些有用的工具。 在学习本书的大多数时候,通过使用 SBT,你便能使用其他工具。SBT 会自动下载指定版本的 Scala 编译器、标准库以及需要的第三方资源。

不使用 SBT,也能很方便地单独下载 Scala 工具。我们会提供一些 SBT 外使用 Scala 的例子。

请遵循 Scala 官方网站(http://www.scala-lang.org)中的链接安装 Scala,还可以选择安装 Scaladoc。Scaladoc 是 Scala 版的 Javadoc(在 Scala 2.11中,Scala 库和 Scaladoc 被切分为许多较小的库)。你也可以在线查阅 Scaladoc(http://www.scala-lang.org/api/current)。为了方便你使用,本书中出现的 Scala 库中的类型,大部分都附上了连接到 Scaladoc 页面的链接。

Scaladoc 在页面左侧类型列表上面提供了搜索栏,这有助于快速查找类型。同时,每个类型的入口处都提供了一个指向 Scala GitHub 库中对应代码的链接(https://github.com/scala/scala),这能很好地帮助用户学习这些库的实现。这个链接位于类型概述讨论的底部,链接所在行标注着 Source 字样。

你可以选用任何文本编辑器或 IDE 来处理这些示例,也可以为这些主流编辑器或 IDE 安装 Scala 支持插件。具体方法,请参见21.3节。通常而言,访问你所青睐的编辑器的社区,能最及时地发现 Scala 相关的支持信息。1.2.1 使用SBT

21.2.1节将介绍 SBT 是如何工作的。下面,我们介绍当前需要掌握的一些基本指示。

当你启动 sbt 命令时,假如不指定任何任务,SBT 将启动一个交互式 REPL(REPL 是 Read、Eval、Print、Loop 的简写,代表了“读取 - 求值 - 打印 - 循环”)。下面我们将运行该命令,并尝试运行一些可用的任务。

下面列举的代码中,$ 表示 shell 命令提示符(如 bash 命令提示符),你可以在该提示符下运行 sbt 命令;> 是 SBT 默认的交互提示符,可以在 # 符号后编写 sbt 注释。你可以以任意顺序输入下面列举的大多数 sbt 命令。$ sbt> help # 描述命令> tasks # 显示最常用的、当前可用的任务> tasks -V # 显示所有的可用任务> compile # 增量编译代码> test # 增量编译代码,并执行测试> clean # 删除所有已经编译好的构建> ~test # 一旦有文件保存,执行增量编译并运行测试 # 适用于任何使用了~前缀的命令> console # 运行Scala REPL> run # 执行项目的某一主程序> show x # 显示变量X的定义> eclipse # 生成Eclipse项目文件> exit # 退出REPL(也可以通过control-d的方式退出)

为了能编译更新后的代码并运行对应测试,我通常会执行 ~test 命令。SBT 使用了增量的编译器和测试执行器,因此每次执行时不用等待完全构建所需时间。假如你希望执行其他任务或退出 sbt,只需要按一下回车键即可。

假如你使用安装了 Scala 插件的 Eclipse 进行开发,便能很方便地执行 eclipse 任务。运行 eclipse 任务将生成对应的项目文件,这些生成的代码作为 Eclipse 项目文件进行加载。如果你想使用 Eclipse 来处理示例代码,请执行 eclipse 任务。

假如你使用最近发布的 Scala 插件 IntelliJ IDEA 进行开发,直接导入 SBT 项目文件便能生成 IntelliJ 项目。

Scala 中已经包含了REPL环境,你可以执行 console 命令启动该环境。如果你希望在 REPL 环境下运行本书中的代码示例,那么通常情况下,你首先需要运行 console 命令:$ sbt> console[info] Updating {file:/.../prog-scala-2nd-ed/}prog-scala-2nd-ed...[info] ...[info] Done updating.[info] Compiling ...[info] Starting scala interpreter...[info]Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java ...).Type in expressions to have them evaluated .Type :help for more information.scala> 1 + 2res0: Int = 3scala> :quit

此处省去若干输出,与 SBT REPL 一样,你也可以使用 Ctrl-D 退出系统。

运行 console 时,SBT 首先会构建项目,并通过设置 CLASSPATH 使该项目可用。因此,你也可以使用 REPL 编写代码进行试验。 使用 Scala REPL 能有效地对你编写的代码进行试验,也可以通过 REPL 来学习 API,即便是 Java API 亦可。在 SBT 上使用 console 任务执行代码时,console 任务会很体贴地为你在 classpath 中添加项目依赖项以及编译后的项目代码。1.2.2 执行Scala命令行工具

如果你单独安装了 Scala 命令行工具,会发现与 Java 编译器 javac 相似,Scala 编译器叫作 scalac。我们会使用 SBT 执行编译工作,而不会直接使用 scalac。不过如果你曾运行过 javac 命令,会发现 scalac 语法也很直接。

在命令行窗口中运行 -version 命令,便可查看到当前运行的 scalac 版本以及命令行参数帮助信息。与之前一样,在 $ 提示符后输入文本。之后生成的文本便是命令输出。$ scalac -versionScala compiler version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL$ scalac -helpUsage: scalac where possible standard options include: -Dproperty=value Pass -Dproperty=value directly to the runtime system. -J Pass directly to the runtime system. -P:: Pass an option to a plugin ...

与之类似,执行下列 scala 命令也可以查看 Scala 版本及命令参数帮助。$ scala -versionScala code runner version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL$ scala -helpUsage: scala [ ] or scala -helpAll options to scalac (see scalac -help) are also allowed....

有时我们会使用 scala 来运行 Scala“脚本”文件,而 java 命令行却没有提供类似的功能。下面将要执行的脚本来源于我们的示例代码:// src/main/scala/progscala2/introscala/upper1.scclass Upper { def upper(strings: String*): Seq[String] = { strings.map((s:String) => s.toUpperCase()) }}val up = new Upper

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载