首页>参考读物>计算机科学与技术>软件与程序设计

Scala编程实战
作者 : Alvin Alexander著
译者 : 马博文 张锦文 任晓君 译
出版日期 : 2016-06-15
ISBN : 978-7-111-52686-5
定价 : 119.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 660
开本 : 16
原书名 : Scala Cookbook
原出版社: O'Reilly Media USA
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

图书特色

本书向读者介绍如何省时省力地使用Scala构建面向对象、函数式、并发应用。书中囊括250个实用技巧以及700多个代码实例,覆盖了开始学习Scala语言、类库和工具时最常见的问题。本书可作为学习使用JVM语言的理想参考书,同时也适用于有经验的Scala开发者。
Alvin Alexander(devdaily.com创始人)使用Scala构建可扩展性高、基于组件的并行和分布式应用,将大量实用经验汇集在本书中,结合真实的使用场景,为读者提供了以下实用技巧:
■ 字符串、数值类型和控制结构
■ 类、方法、对象、特质和包
■ 多种情况下的函数式编程
■ Scala丰富的集合类及方法
■ 使用Akka类库进行并发
■ 使用Scala REPL以及SBT构建工具
■ 客户端和服务器端的Web服务
■ 与SQL和NoSQL数据库交互
■ Scala开发的最佳实践

图书前言

Scala是我用过的最有趣的编程语言,这本书是用Scala解决问题的cookbook。本书囊括了超过250个问题的解决办法,逾700个范例(我没有数过,但是我觉得是准确的)。
本书有如下几个特点:
作为一本cookbook,本书旨在通过对最常见的问题提供解决办法,以节省你学习的时间。
几乎所有的例子都在Scala解释器中演示。这样一来,不论你是在电脑旁、飞机上,或者在最喜爱的摇椅中阅读,都可以看到它们确切的输出结果。(好处是你经常会发现,“啊,原来是这么工作的。”)
本书不仅涵盖Scala语言,而且花了大量的篇幅介绍Scala的工具和类库,包括SBT、actor、集合类库和JSON处理。
本书发布前进行了更新,覆盖Scala2.10.x和SBT0.12.3。
Scala语言
我在推广Scala的演讲中说它是Ruby和Java的孩子:它具有Ruby的轻量,简洁和可读的特性,但它将编译好的class文件打包成Jar文件并且在JVM上运行;它使用特性(traits)和混入(mixins),感觉很动态,但它是静态类型的。它使用Actor模型去简化并发编程,更好地利用多核处理器。Scala这个名字来自单词scalable,顾名思义,它为世界上最繁忙的网站,包括Twitter、Net ix、Tumblr、LinkedIn、Foursquare等的运行提供动力。
在我看来,Scala并不适于编程的初级课程。相反,它是为专业程序员定制的强力语言。但是别害怕。如果你是我的兄弟,而且在不限制编程语言的前提下开始一个新的项目,我会毫不犹豫地推荐“使用Scala”。
以下是Scala的一些其他优点:
它是一门现代编程语言,作者是MartinOdersky(javac之父),受到Java、Ruby、Smalltalk、ML、Haskell、Erlang等语言的影响。
它是一门纯面向对象(OOP)语言。每个变量都是一个对象,每个“操作符”都是方法。
它同时也是一门函数式编程(FP)语言,可以将函数作为参数传递。你可以用OOP、FP,或者两者结合的方式编写代码。
Scala代码在JVM上运行,可以无缝使用已有的丰富的Java类库。
接触语言的第一天你就能编出有趣的程序,但是这门语言很深奥,随着学习的深入,你会发现更新、更好的编写代码的方式。Scala会改变你对编程的看法——这是一件好事。
在Scala所有的优点中,我最喜欢的是它可以让你编写简洁、可读性好的代码。据称,程序员花在读代码和编写代码的时间比例是10∶1,所以,编写简洁和可读性好的代码很重要。因为Scala的这些特性,程序员都说它具有表现力。
解决办法
我经常购买O'Reilly的cookbook书籍寻求解决办法,这也是本书的目的:解决问题。
阅读一本cookbook书时,我常常思考,“我碰到一个问题,需要遍历数组中的每个元素,最好的方式是什么?”我喜欢查看目录表,找到对应的章节,实现解决办法,然后继续。撰写每个章节时我都遵循这样的步骤。
然而,使用Scala这样的现代语言,我有可能会给出错误的答案。基于以前的编程经验,我可能会想“我需要遍历数组中的每个元素”,但是实际上我有更深层次的目的,如将它们转换成一个新的集合。所以当一个章节说,“嗨,我知道你读这里是想知道如何遍历数组中的元素,你应该这么做”:
for(i<-Array(1,2,3))println(i)
“但是,如果尝试将这些元素转换为新的集合,应该使用for/yield表达式或者map方法”:
//for/yield
scala>for(i<-Array(1,2,3))yieldi*2
res0:Array[Int]=Array(2,4,6)
//map
scala>Array(1,2,3).map(_*2)
res1:Array[Int]=Array(2,4,6)

(不久我们会讨论更多关于_字符的内容。)
我遵循“吃自己的狗食”(https://en.wikipedia.org/wiki/Eating_your_own_dog_food)的原则去创建问题和解决办法的列表。书中问题的解法来自我创建的Scala脚本、Web应用、Web服务、Swing应用和基于actor系统的实际经验。当开发需要的应用时,我会碰到如下的问题:
Scala文件通常比较小,合理组织一个项目的方式是什么?
SBT似乎是最适合Scala的构建工具,但是它和Ant或者Maven都不同。如何编译和打包应用,怎么处理依赖?
构造函数和Java很不同,如何创建它们?在声明构造函数参数和类字段时生成了什么代码?
Actor很棒,如何编写一个完整的基于actor的应用?
再也不应该用null了?为什么不?没有了它怎么写代码?
可以将函数像其他变量一样传递?如何做,好处是什么?
为什么有这么多集合类,为什么每个类都有这么多方法?
遗留系统的Java代码,还能在Scala中使用吗?如果可以,该怎么做?
我开始理解Scala语言了。现在我需要知道,编写Scala代码的前5或者前10的“最佳实践”是什么?
说真的,我很快就爱上了Scala的一切,除了一件事情:集合类看上去庞大而让人生畏。我享受使用Scala所以我一直在用这门语言,但是当我需要一个集合时,我转向了老旧但是可靠的Java集合。
后来有一天,我鼓起勇气深入了集合类库。我以为我会讨厌它,但是当坚持了一段时间后,我突然“理解”了它。受到启发后,我举一反三,立刻理解了包括集合在内的其他我不太理解的概念。我才意识到集合类的作者没有疯,他们非常聪明。
理解集合类后,我再也没用过for循环,开始使用集合类方法如filter、foreach和map。它们让编写代码变得更简单,让我的代码变得更简洁。现在,我没有找到比这更好的编码方式:
//filtertheitemsinalist
scala>valnums=List(1,2,3,4,5).filter(_<4)
nums:List[Int]=List(1,2,3)
_通配符在多个例子中都讨论过,但是,从上面的例子可以看出,它是集合中每个元素的占位符。filter遍历列表中的元素,每次都调用_<4函数。这一行Scala代码等同于下面的Java代码:
Integer[]intArray={1,2,3,4,5};
Listnums=Arrays.asList(intArray);
ListfilteredNums=newLinkedList();
for(intn:nums){
if(n<4)filteredNums.add(n);
}
接下来的例子更进一步。和前面的一样,它先过滤了元素,然后用map方法将每个元素都乘以2:
//filter the items,then double them
scala>val nums=List(1,2,3,4,5).filter(_<4).map(_*2)
nums:List[Int]=List(2,4,6)
想想如果用其他语言来实现这个表达式所用的代码数量,你就会认同Scala的表现力。
(书中每一节的例子都分解成很小的部分,有助于Scala新手理解。)
读者对象
这本书旨在为使用Scala的程序员提供参考,在他们使用Scala和它的类库、工具遇到问题时,通过阅读本书快速找到答案。同时,我也希望本书成为想学习Scala的程序员的一个好工具。我个人是“通过实例学习”的信徒,且本书满满的都是例子。
我假设读者已经具有一些编程语言,如C、C++、Java、Ruby、C#、PHP、Python等的经验。我本人有使用这些语言的经验,所以我的写作也受到这个背景的影响。
另一种描述本书读者对象的方式是通过软件开发者的等级。在MartinOdersky的这篇文章(http://www.scala-lang.org/old/node/8610)中定义了如下不同等级的计算机程序员:
LevelA1:初级应用程序员。
LevelA2:中级应用程序员。
LevelA3:专家级应用程序员。
LevelL1:初级类库设计师。
LevelL2:中级类库设计师。
LevelL3:专家级类库设计师。
本书的主要目标读者为A1、A2、A3的应用开发者和L1的类库设计者。帮助这些开发者是我的主要目标,同时我希望L2和L3的开发者也可以从本书众多的例子中获益——尤其是如果他们没有函数式编程的经验,或者他们希望跟上Scala及其相关工具和类库更新的速度。
内容简介
本书前3章涵盖Scala语言的一些具体细节。
第1章,字符串,介绍字符串使用的技巧。Scala字符串的基本功能从Java继承而来,在Scala强大的隐式转换(implicitconversions)帮助下,通过StringLike和StringOps类增加了更多的功能,如字符串可以当作字符序列。本章最后一个例子展示如何通过创建隐式转换为字符串类(或者其他类)添加自定义行为。
第2章,数值,介绍Scala数值类型的使用技巧。在Scala语言里,数字类型不支持++或者--的一元操作,本章解释了其中的原委以及其他你可以使用的方法。同时,本章展示了处理大数、货币以及如何比较浮点数的办法。
第3章,控制结构,介绍了Scala内建的控制结构,首先解释if/then声明、for循环,然后提供如何使用for/yield循环(forcomprehensions)以及for循环内嵌if声明的办法。鉴于表达式匹配对于Scala的重要性,在此将展示用以上方法解决一系列问题的技巧。
接下来的5章将概括Scala的语法,强调用类、方法、对象、特质、包去组织你的Scala工程。类、方法、对象、特质的技巧则侧重于面向对象编程技术。
第4章,类和属性,提供了Scala类和字段的例子。Scala的构造函数和Java极其不同,因此我将用几个例子来展示实现基本构造函数和辅助构造函数的来龙去脉。本章同时还会介绍如何覆写Scala为val和var变量自动生成的取值(accessor)和修改(mutator)方法。从这些例子中你可以学到什么叫作case类,如何使用和创建equals方法。第5章,方法,介绍如何定义方法去接受参数、返回值,用指定参数名的方式调用方法,为参数预先赋值,创建变长字段,编写支持链式编程的方法。
第6章,对象,介绍“一切皆对象”的概念。与Java类似,Scala使用object这个单词去定义类的一个实例,但object在Scala中也是一个关键字。本章涵盖的主题包括类的转换,如何用对象去启动一个应用,如何创建与Java等同的静态成员,以及如何为一个类创建伴生对象,以避免使用new关键字的方式去创建类的实例。
第7章,包和导入,提供Scala的包和导入声明的例子,由之可见其比Java的包和导入更加强大。具体内容包括如何使用大括号去引入包,在导入依赖时如何隐藏和重命名成员等。
第8章,特质,提供了Scala特质的一些例子。首先展示如何像使用Java接口一样使用特质,然后进入更加高级的主题,如怎样用混入的方式去使用特质,以及使用一些方法去限制哪些成员可以混入一个特质。
虽然本书的大部分内容都会涉及函数式编程技术,第9章,函数式编程,将重点介绍函数式编程的技巧。本章给出了如何定义函数字面量(functionliterals)以及在不同场合下使用它们的方案。其中的例子包括如何定义一个方法接受函数参数,如何在一个函数中返回函数,以及如何使用闭包和部分应用函数(partiallyappliedfunctions)。
Scala的集合类库博大精深,第10章,集合和第11章,列表、数组、映射、集合等,给出了与集合相关的解决办法。
第10章,集合,相关的例子将帮助你在不同的需求下选择适当的集合类以及方法去解决具体的问题,如不同集合间的转换,集合的过滤,创建集合的子集。超过60页的技巧描述通过filter,foreach,groupBy,map等方法编写for循环和for/yield表达式。
第11章,列表、数组、映射、集及其他,继续第10章遗留的内容,除了提供前面提到过的特定的集合类型的解决办法,还包括了队列(Queue)、栈(Stack)和范围(Range)类。
第12章,文件和进程,首先提供用Scala读写文件,包括CSV文件的解决办法。其次,鉴于通过Scala类库使用外部进程比Java更加容易,我将用一些例子来展示如何执行外部命令以及与I/O一起工作。
第13章,Actors和并发,提供了使用ScalaActor库去构建并发应用(使用多核CPU)的解决办法。本章中的例子将展示如何使用已经集成的工业级的AkkaActors类库2.10.x版本的Scala去解决常见的问题。其中包括如何从头构建基于actor的应用,如何向actors发送消息,如何在actors中接受和使用消息,以及如何杀死actors、关闭系统。同时你会发现用Future类运行并发任务进行简单的并行计算是如此得容易。
第14章,命令行任务,介绍一系列围绕在命令行中使用Scala的例子。首先展示一些如何使用ScalaREPL的贴士,然后介绍如何使用scalac、scala、scaladoc、fsc等命令行工具。同时,本章还介绍将Scala作为一门脚本语言的使用技巧,包括通过预编译Scala脚本来加速运行。
第15章,Web服务,介绍如何在Web服务的客户端和服务器端去使用Scala。在服务器端,将使用Scalatra和Play框架去开发RESTful的Web服务,包括如何在Scalatra中使用MongoDB。客户端和服务器端的实例代码都会展示如何序列化和反序列化JSON,以及如何使用HTTP报头。
第16章,数据库和持久化,提供了通过Scala和数据库交互的例子,包括与传统的使用JDBC和SpringJDBC关系数据库的交互,以及和当下流行的NoSQL数据库MongoDB的交互。
第17章,与Java交互,介绍如何解决一些和Java代码一起工作的问题。除了一些罕见的陷阱,Scala代码和Java代码的兼容性没有太大的问题。本章将介绍如何去解决Scala和Java因集合类库不同引发的问题,以及在Java代码中调用Scala代码遇到的问题。
第18章,简单构建工具(SBT),SBT是公认的Scala应用构建工具,本章是SBT的全面指南。首先将展示创建SBT工程结构的几种方式,其次介绍如何引入托管的和非托管的依赖,构建你的工程,为工程创建Scala文档,部署工程等。虽然本章也给出了一个使用Ant编译Scala工程的例子,但仍然强烈推荐大家使用SBT。
第19章,类型,提供了使用Scala强大的类型系统的技巧。从介绍类型开始,展示了诸如类型变化、边界、制约等的例子。例子将展示如何在类和方法定义中声明泛型,实现“ducktyping”,以及控制混入特质的类型。
第20章,惯用法,对于一本cookbook书来说很另类,但是本书是介绍解决办法的,所以我认为用单独一章去展示最佳实践是非常重要的,如怎样用Scala的方式写代码。本章将展示如何创建没有副作用的函数,如何使用不可变的对象和集合类型,如何在表达式(而不是声明)的方面思考,如何使用模式匹配,如何消除代码中null值的技巧。
在线奖励章节
Scala是一门如此丰富和深刻的语言,对于想要继续深入研究Scala语言的读者,我为读者提供了额外的3个免费在线章节,内容涵盖如下主题:
XML和XPath。
测试和调试。
Play框架。
可以在http://examples.oreilly.com/9781449339616-files/下载到这3个章节的PDF版本。
软件安装
Scala安装很简单,只需要几分钟的时间。
在UNIX系统(包括MacOSX)中,在Scala下载页面(http://www.scala-lang.org/download/)将安装包下载至电脑的$HOME/scala目录,然后在$HOME/.bash_profile(或者和其等同的文件)中添加如下几行脚本:
exportSCALA_HOME=/Users/Al/scala
PATH=$PATH:/Users/Al/scala/bin
这步完成后,当打开一个新的终端窗口时,就可以在命令行中使用scala和scalac命令了。
使用Windows系统的读者可以使用MSI的安装包或者按照Scala下载页面详细指南去安装。
代码清单如何工作
本书的大多数代码都可以在ScalaREPL(“Read-Eval-Print-Loop”)中运行,它和Ruby的irb功能类似,在REPL中输入表达式,它会执行并输出结果。
在REPL的例子里,输入的代码都会以粗体显示,REPL的输出的文本都不是粗体。
在操作系统的命令行中输入scala就可以启动REPL:$ scala
Welcome to Scala version 2.10.1
Type in expressions to have them evaluated.
Type:help for more information.
scala>_
启动后,只需要输入表达式,REPL就会执行并输出结果:
scala>valhello="Hello,world"
hello:String=Hello,world
scala>Array(1,2,3).foreach(println)
1
2
3
第1章的引言和14.1节介绍了更多关于ScalaREPL的内容。14.4节进一步介绍了如何定制REPL环境变量。
排版约定
本书在印刷的字体上采取以下惯例:
斜体(Italic)
用于术语、链接、邮件地址、文件名和文件扩展名。
等宽字体(Constantwidth)
用于代码列表,以及段落内程序元素如变量或者函数名、数据库、数据类型、环境变量、语句和关键字。
等宽粗体(Contantwidthbold)
显示命令或者其他必须由用户输入的文本。
等宽斜体(Constant width italic)
显示应该被用户提供的值或者是上下文决定的值的代替文字。
使用示例代码
本书是为了帮助你完成工作。通常来说,如果本书包含示例代码,你可以在你的程序或者文档中使用这些代码。你不需要联系我们获得许可,除非你是要复制大部分的代码。比如,用书中的几段代码实现一个程序不需要获得许可。销售或分发O'Reilly出版书籍的光盘中的例子则需要获得许可。引用本书和示例代码回答问题并不需要许可。将本书的大量例子代码加入到你的产品文档中则需要获得许可。补充材料(代码示例,习题等)可以在https://github.com/alvinj下载。
如果引用本书的内容,我们感谢你能标明出处,但是并不要求一定这么做。引用的出处通常以固定的格式给出,包含标题、作者、出版商以及ISBN号。比如:“ScalaCookbookbyAlvinAlexander(O’Reilly).Copyright2013AlvinAlexander,978-1-449-33961-6.”。
如果你对本书的示例代码的使用超出了合理使用或者上面给出的免许可使用范畴,请通过permissions@oreilly.com邮箱联系我们。
Safari在线图书
Safari在线图书(www.safaribooksonline.com)是一个随选的数字库,用图书和视频两种形式,讲述了来自世界行业领导者的技术和商业专业知识。
技术专家、软件开发者、网站设计者和创业者都将Safari在线图书作为他们进行搜索、解决问题、学习和证书培训的首选资源。
Safari在线图书为企业、政府代理和个人进行产品融合和系统定价提供了基础知识。用户已经访问了许多图书、培训视频和全文检索数据库中已正式出版的原稿,这些原稿来自很多出版者,例如,O’ReillyMedia、PrenticeHallProfessional、Addison-WesleyProfessional、MicrosoftPress、FocalPress、CiscoPress、JohnWiley&Sons、Syngress、MorganKaufmann、IBMRedbooks、Packt、AdobePress、FTPress、Apress、Manning、NewRiders、McGraw-Hill、Jones&Bartlett、CourseTechnology等,关于Safari在线图书的更多信息,请在线联系我们。
我们的联系方式
对本书有任何的评论和疑问,可以将它们提交给本书的出版商:
美国:
O’ReillyMedia,Inc.
1005GravensteinHighwayNorthSebastopol,CA95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
读者朋友可以通过下面的网址浏览本书的网页:
http://oreil.ly/Scala_CB
如果期望对本书进行评论或者咨询相关的技术问题,可以发电子邮件到下面的邮箱:
bookquestions@oreilly.com
如果期望了解更多的关于书籍、教程、会议和新闻,请浏览我们的网站:
http://www.oreilly.comh
ttp://www.oreilly.com.cn
致谢
写这么厚的一本书需要耗费很多时间,我要感谢责任编辑,CourtneyNash,一直在写作的过程中鼓励我,在遇到困难时让我保持清醒的头脑。
KimCofer是本书的文字编辑,感谢她纠正我重复多次的语法错误,讨论书中出现的几个问题,最终使本书成型。
我还要特别感谢EricTorreborre和RyanLeCompte,一路经历了本书不同的版本。另外要感谢的是RudiFarkas、RahulPhulore、JasonSwartz、HugoSerenoFerreira和DeanWampler。
同时我也要感谢我的朋友和家人,他们在我写作的过程中一直鼓励我。特别感谢我的妹妹Melissa,她帮助我将维基格式文字的原稿转化为微软的Word文档,并保持了正确的格式。
最后,我要感谢MartinOdersky以及他的团队创造了这么一个有趣的编程语言。同时,我特别感谢他的REPL中的ProgrammingMethodsLaboratory,因为我在10.4节中的Scala集合性能表中引用了它。

上架指导

计算机\程序设计

封底文字

本书向读者介绍如何省时省力地使用Scala构建面向对象、函数式、并发应用。书中囊括250个实用技巧以及700多个代码实例,覆盖了开始学习Scala语言、类库和工具时最常见的问题。本书可作为学习使用JVM语言的理想参考书,同时也适用于有经验的Scala开发者。
Alvin Alexander(devdaily.com创始人)使用Scala构建可扩展性高、基于组件的并行和分布式应用,将大量实用经验汇集在本书中。结合真实的使用场景,为读者提供了以下实用技巧:

- 字符串、数值类型和控制结构
- 类、方法、对象、特质和包
- 多种情况下的函数式编程
- Scala丰富的集合类及方法
- 使用Akka类库进行并发
- 使用Scala REPL以及SBT构建工具
- 客户端和服务器端的Web服务
- 与SQL和NoSQL数据库交互
- Scala开发的最佳实践

Alvin Alexander 拥有德州农工大学航天工程学位,从1999年开始就是Java/OOP程序员、指导者。他是Valley Programing软件咨询公司创始人,同时在他的个人主页上提供了Java、Scala、Ruby等编程语言的教程。

作者简介

Alvin Alexander著:暂无简介

译者简介

马博文 张锦文 任晓君 译:暂无简介

译者序

刚开始走入工作岗位的时候,当时公司多数的项目都在使用Ruby语言,接触不久便深深地爱上了Ruby的灵活和可读性。2013年时,客户决定拆分一个遗留系统,并且尝试用基于Scala语言的Play框架去搭建微服务。第一次接触的时候,感觉非常震惊,因为这门基于JVM的语言,除了保留了Java静态检查的好处,还兼有OOP和FP的能力,并且写起来让我找到了Ruby的感觉。我们从Scala中受益匪浅,后续的微服务,都是采用基于Scala语言的框架,Unfinagled和Unfilterd,都取得了成功。我有理由相信,Scala将成为整条业务线的技术选择的标准。
从大的范围来看,越来越多的公司也开始采用Scala,如Twitter、LinkedIn、Coursera等。我们耳熟能详的一些大数据处理平台,如Storm和Spark,也都是基于Scala语言去构建的。TypeSafe的官网(https://www.typesafe.com/resources/case-studies-and-stories)给出了很多用户案例。从这些例子我们可以看出,Scala的未来不可限量,值得我们投入时间去学习。
学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想,这是我认为学习Scala最困难的地方,因为很多程序员还处在面向对象编程的学习阶段。和很多其他编程语言的学习一样,如果一开始有丰富的例子可以参考,可以帮助你解决上手时的问题,不管是对于项目的进度,以及进一步的深入学习,都是大有裨益的。本书就是你学习Scala的绝佳指南,它面向实际的使用场景,提供了大量的实例,同时,也给出底层的原理和相关的参考。对于Scala新手来说这是一本非常不错的入门书,而对于老手来说也是一本夯实基础,检视自己所学知识的好书。
感谢作者Alvin Alexander为我们带来这本实用的Scala作品,感谢我的同事张锦文和任晓军对这次翻译的鼎力相助,我们都是第一次翻译英文技术书籍,而且是如此鸿篇巨著,这对我们来说是莫大的挑战。感谢我的家人和女友对我工作的支持和理解,没有他们我无法完成这个任务。
本书翻译过程中,译者已尽力将原著的意思还原到中文的语境 ,但毕竟能力和经验都尚浅,难免有不足和疏漏的地方。望各位读者批评斧正。

马博文
2015年6月29日

图书目录

前言..................................................1
第1章字符串........... 11
1.1 测试字符串的相等性..................................14
1.2 创建多个字符串.........................................16
1.3 分隔字符串.................................................17
1.4 字符串中的变量代换..................................19
1.5 挨个处理字符串中的字符...........................23
1.6 字符串中的查找模式..................................27
1.7 字符串中的替换模式..................................30
1.8 抽取String 中模式匹配的部分.....................31
1.9 访问字符串中的一个字符...........................33
1.10 在String 类中添加自定义的方法...............34
第2章数值..............39
2.1 从字符串到数值.........................................40
2.2 数值类型转换.............................................44
2.3 重载默认数值类型......................................45
2.4 替代++ 和--.............................................47
2.5 浮点数的比较.............................................49
2.6 处理大数.....................................................51
2.7 生成随机数.................................................53
2.8 创建一个数值区间、列表或者数组............55
2.9 格式化数值和金额......................................57
第3章控制结构.......60
3.1 for 和foreach 循环........................................61
3.2 在for 循环中使用多个计数器......................67
3.3 在for 循环中嵌入if 语句(卫语句)............69
3.4 创建for 表达式(for/yield 组合)................70
3.5 实现break 和continue...................................72
3.6 像三元运算符一样使用if............................77
3.7 像switch 语句一样使用匹配表达式.............78
3.8 一条case 语句匹配多个条件........................83
3.9 将匹配表达式的结果赋值给变量...............84
3.10 访问匹配表达式缺省case 的值..................84
3.11 在匹配表达式中使用模式匹配.................85
3.12 在匹配表达式中使用Case 类....................92
3.13 给Case 语句添加if 表达式(卫语句).......93
3.14 使用匹配表达式替换isInstanceOf.............94
3.15 在匹配表达式中使用List..........................95
3.16 用try/catch 匹配一个或者更多的异常......97
3.17 在try/catch/finally 块中使用变量前定义变量.........................98
3.18 创建自定义控制结构..............................100
第4章类和属性.....103
4.1 创建一个主构造函数................................104
4.2 控制构造函数字段的可见性.....................108
4.3 定义辅助构造函数.................................... 111
4.4 定义私有的主构造函数............................115
4.5 设置构造函数参数的默认值.....................116
4.6 覆写默认的访问和修改方法.....................118
4.7 阻止生成getter 和setter 方法......................121
4.8 将代码块或者函数赋给字段.....................123
4.9 设置未初始化的var 字段类型....................125
4.10 在继承类时处理构造函数参数...............127
4.11 调用父类的构造函数..............................129
4.12 何时使用抽象类......................................131
4.13 在抽象基类(或者特质) 里定义属性........133
4.14 用Case 类生成模板代码..........................137
4.15 定义一个equals 方法(对象的相等性)..141
4.16 创建内部类.............................................144
第5章方法............147
5.1 控制方法作用域.......................................148
5.2 调用父类的方法.......................................152
5.3 方法参数默认值.......................................154
5.4 使用参数名...............................................157
5.5 定义一个返回多个值(Tuples) 的方法........159
5.6 调用getter/setter 方法时不使用括号..........160
5.7 创建接受变参的方法................................162
5.8 方法的异常声明......................................164
5.9 支持链式调用编码风格............................166解决办法...167
第6章对象............170
6.1 对象的强制转换.......................................171
6.2 Java.class 的Scala 等价类...........................173
6.3 确定对象所属的类....................................174
6.4 用Object 启动一个应用.............................175
6.5 用object 创建单例......................................177
6.6 用伴生类创建静态成员............................178
6.7 将通用代码放入包对象............................180
6.8 不使用new 关键字创建对象实例...............183
6.9 在Scala 中用apply 方法实现工厂方法........187
第7章包和导入.....190
7.1 花括号风格的包记号法............................191
7.2 引入一个或多个成员................................192
7.3 在导入时重命名成员................................194
7.4 在引入时隐藏一个类................................195
7.5 使用静态导入...........................................196
7.6 在任意地方使用Import 语句......................197
第8章特质............200
8.1 特质用作接口...........................................200
8.2 使用特质中的抽象字段和实际字段..........203
8.3 像抽象类一样使用特质............................204
8.4 简单混入特质...........................................205
8.5 通过继承来限制特质的使用范围.............206
8.6 限定特质只可用于指定类型的子类..........208
8.7 保证特质只能被添加到只有一个特定方法的类型..........................210
8.8 为对象实例中添加特质............................211
8.9 像特质一样继承一个Java 接口..................212
第9章函数式编程..214
9.1 使用函数字面量(匿名函数).................215
9.2 将函数作为变量.......................................216
9.3 定义接受简单函数作为参数的方法..........220
9.4 更多复杂的函数.......................................222
9.5 使用闭包...................................................226
9.6 使用部分应用函数....................................231
9.7 创建返回函数的函数................................232
9.8 创建部分应用函数....................................235
9.9 一个真实的例子.......................................239
第10 章集合..........242
10.1 理解集合的层级结构..............................243
10.2 选择一个集合类......................................247
10.3 用一个集合方法解决一个问题...............252
10.4 理解集合的性能......................................258
10.5 在创建集合时声明一个类型...................260
10.6 理解可变变量与不可变集合...................262
10.7 将Vector“变为”不可变序列................263
10.8 把ArrayBuffer 作为可变序列的第一选择265
10.9 用foreach 遍历一个集合..........................267
10.10 用for 循环遍历一个集合........................269
10.11 使用zipWithIndex 或者zip 创建循环计数器........................272
10.12 迭代器的使用.......................................275
10.13 用for/yield 实现集合间的转换...............276
10.14 用map 实现集合的变换.........................279
10.15 展平列表的列表与扁平化问题.............281
10.16 map,flatten 和flatMap 的组合...............283
10.17 用filter 过滤一个集合...........................285
10.18 从集合中提取元素序列........................287
10.19 序列的分割(groupBy 、partition 等)..289
10.20 用reduce 和fold 方法遍历集合...............291
10.21 从序列中提取不重复的元素................296
10.22 合并序列集合.......................................297
10.23 用zip 将两个序列集合合并为一对.........300
10.24 在集合上创建一个惰性视图.................301
10.25 利用Range 创建集合..............................305
10.26 创建使用枚举.......................................307
10.27 当需要一堆元素时使用元组.................308
10.28 集合排序...............................................310
10.29 通过mkString 将集合转换成字符串......313
第11 章列表、数组、映射、集及其他..........................315
11.1 创建和填充列表的不同方式...................316
11.2 创建可变List...........................................318
11.3 为List 添加元素.......................................319
11.4 从List(或者ListBuffer)中删除元素.....321
11.5 合并或连接列表......................................323
11.6 使用List 的懒惰版本,Stream.................324
11.7 创建和更新数组的不同方式...................326
11.8 创建大小可变的数组(ArrayBuffer)....328
11.9 删除Array 和ArrayBuffer 的元素..............329
11.10 数组排序...............................................331
11.11 创建多维数组........................................332
11.12 创建映射...............................................334
11.13 选择一种Map 实现.................................336
11.14 为可变映射添加、更新或删除元素......338
11.15 为不可变映射添加、更新或删除元素..340
11.16 访问映射的值........................................342
11.17 遍历映射...............................................344
11.18 从映射中获得所有的键或者值.............345
11.19 反转键值...............................................346
11.20 测试映射中键/值的存在........................347
11.21 过滤映射...............................................348
11.22 根据键或者值对映射排序.....................350
11.23 找到映射中最大的键或者值.................354
11.24 给集添加元素........................................355
11.25 从集中删除元素....................................357
11.26 使用可排序集........................................359
11.27 使用队列...............................................360
11.28 使用栈...................................................362
11.29 使用Range.............................................365
第12 章文件和进程367
12.1 如何打开和读取文本文件.......................367
12.2 写入文本文件.........................................373
12.3 读写二进制文件......................................374
12.4 如何处理文本文件中的每个字符...........375
12.5 如何处理CSV 文件.................................376
12.6 将字符串伪装为文件..............................379
12.7 使用序列化.............................................381
12.8 列出目录中的文件.................................382
12.9 列举目录之下的子目录..........................384
12.10 执行外部命令.......................................385
12.11 执行外部命令并使用标准输出.............388
12.12 处理外部命令的标准输出和标准错误输出............................390
12.13 构建命令管道.......................................392
12.14 重定向外部命令的标准输出和标准输入.................................393
12.15 在进程中使用AND(&&)和OR(||)395
12.16 外部命令中处理通配符........................396
12.17 如何在不同目录下运行进程.................397
12.18 在运行命令时设置环境变量.................398
12.19 执行外部命令的方法索引....................399
第13 章Actors 和并发..................................................401
13.1 Actor 简单入门........................................403
13.2 创建构造函数有参数的actor...................407
13.3 Actor 之间如何通信.................................409
13.4 理解Akka Actor 生命周期方法................411
13.5 启动Actor ...............................................414
13.6 停止Actors..............................................416
13.7 关闭Akka Actor 系统...............................421
13.8 用watch 监控Actor 的死亡.......................422
13.9 Futures 的简单并发.................................425
13.10 给Actor 发消息并等待回复...................433
13.11 用become 切换不同状态........................434
13.12 使用并发集合.......................................436
第14 章命令行任务440
14.1 Scala REPL 初体验..................................441
14.2 往REPL 中粘贴和加载代码块.................445
14.3 在REPL 的Classpath 中添加JAR 文件和类...............................448
14.4 在REPL 中运行Shell 命令........................449
14.5 用scalac 命令编译,scala 命令运行.........451
14.6 反汇编和反编译Scala 代码......................452
14.7 寻找Scala 类库........................................457
14.8 用scaladoc 生成文档................................458
14.9 更快的命令行编译器fsc..........................463
14.10 将Scala 作为脚本语言使用....................464
14.11 通过脚本访问命令行参数.....................468
14.12 在Scala shell 脚本中输入提示...............469
14.13 让Scala 脚本运行得更快........................473
第15 章Web 服务...475
15.1 从Scala 对象中创建JSON 字符串.............475
15.2 从包含集合的类中生成JSON 字符串......479
15.3 从JSON 字符串生成简单Scala 对象.........484
15.4 将JSON 数据解析成为对象的数组..........485
15.5 用Scalatra 创建Web 服务..........................487
15.6 用Scalatra 挂载替换XML Servlet 映射.....490
15.7 访问Scalatra Web 服务的GET 参数..........492
15.8 用Scalatra 处理POST 请求数据................494
15.9 创建一个简单的GET 请求客户端............497
15.10 向POST 链接发送JSON 数据.................501
15.11 获取URL Headers .................................502
15.12 发送请求时设置链接的Headers............503
15.13 用Play 框架创建一个GET 请求的Web 服务..........................504
15.14 向Play 框架的web 服务POST JSON 数据507
第16 章数据库和持久化..............................................510
16.1 用JDBC 连接MySQL...............................511
16.2 用Spring Framework 连接数据库............513
16.3 连接MongoDB 并且插入数据..................516
16.4 用insert,save 或者+= 把文档插入到MongoDB .......................519
16.5 搜索一个MongoDB 集合.........................521
16.6 更新MongoDB 集合中的文档..................525
16.7 获取MongoDB 文档ID.............................526
16.8 删除MongoDB 集合中的文档..................527
16.9 快速浏览Slick.........................................529
第17 章与Java 交互....................................................531
17.1 与Java 集合的转换..................................531
17.2 给Scala 方法添加异常注解以便与Java 交互........................536
17.3 使用@SerialVersionUID 和其他注解.......538
17.4 使用Spring 框架......................................539
17.5 注解变长参数方法..................................542
17.6 当Java 的代码需要JavaBeans ..................543
17.7 包装特质的实现......................................547
第18 章简单构建工具(SBT)....................................551
18.1 用SBT 创建一个项目目录结构................551
18.2 用SBT 编译、运行和打包一个Scala 项目555
18.3 用SBT 和ScalaTest 运行测试....................560
18.4 用SBT 管理依赖......................................562
18.5 控制所使用的可管理依赖的版本...........565
18.6 创建有子项目的项目..............................567
18.7 在Eclipse 中使用SBT...............................569
18.8 生成项目API 文档...................................571
18.9 指定一个Main 类运行..............................572
18.10 使用GitHub 项目作为项目依赖.............574
18.11 告诉SBT 如何找到一个仓库(使用Resolvers)........................575
18.12 通过SBT 堆栈跟踪解决问题..................576
18.13 设置SBT 日志等级................................577
18.14 部署一个单独的、可执行的JAR 文件...578
18.15 发布类库...............................................581
18.16 用Build.scala 取代build.sbt....................582
18.17 在SBT 中使用Maven 仓库的类库...........584
18.18 用Ant 构建Scala 项目.............................586
第19 章类型..........589
19.1 创建使用泛型的类..................................591
19.2 创建一个接收简单泛型的方法...............595
19.3 使用鸭子类型(结构化类型)...............596
19.4 让可变集合非变......................................598
19.5 让不可变集合协变..................................600
19.6 创建所有元素都是基本类型的集合........602
19.7 给封闭模型选择性添加新行为...............605
19.8 用类型构建功能......................................608
第20 章惯用法.......612
20.1 创建没有副作用的方法(纯函数)........613
20.2 选择不可变对象......................................620
20.3 思考“面向表达式编程”.......................624
20.4 使用匹配表达式和模式匹配...................627
20.5 从代码中根除null 值................................630
20.6 使用Option/Some/None 模式..................634

教学资源推荐
作者: Kenneth Barclay;John Savage
作者: [美] 凯·霍斯特曼(Cay Horstmann) 兰斯·尼塞斯(Rance Necaise) 著
作者: [美] 托尼·加迪斯(Tony Gaddis) 著
作者: [美] 丹尼尔·卡斯沃姆(Daniel Kusswurm) 著
参考读物推荐
作者: [西]葛罗瑞亚·布埃诺·加西亚(Gloria Bueno Garcia) 奥斯卡·德尼茨·苏亚雷斯(Oscar Deniz Suarez) 何塞·路易斯·埃斯皮诺萨·阿兰达(Jose Luis Espinosa Aranda) 等著
作者: 李伟 张金辉 等编著
作者: (美)Eugene Agafonov 著