产品特色
编辑推荐
阐述scala核心语法、编程方法与深层原理,内容实用,通俗易学
涵盖Scala实际开发中的重要知识点,实例丰富,代码注解详尽
突出可操作性,力图使读者通过实际操作掌握用Scala进行应用开发
内容简介
本书以Scala语言的核心语法为主线,通过大量实例代码循序渐进地介绍了Scala语言的语法特性。第1章介绍Scala语言及开发环境的安装、IntellijIDEA的使用、Scala语言的交互式命令行。第2~3章重点介绍Scala语言的基础语法结构。第4章,重点介绍Scala语言重要的数据结构collection(集合)。第5章,重点介绍Scala语言中面向函数编程的语法特性。第6~8章,重点介绍Scala语言面向对象编程的语法特性。第9章,介绍Scala语言中的模式匹配及原理。第10章,详细介绍Scala语言的类型系统。第11章,对Scala语言中的隐式转换及原理进行详细介绍。第12章,重点介绍Scala中的并发编程。第13章,介绍Java语言与Scala语言间的互操作。
本书还提供了所有实例的源代码与素材文件,供读者上机练习使用,读者可从网上下载本书资源文件。
本书适用于Scala语言初学者、爱好者,大数据开发人员,软件培训机构以及计算机专业的学生使用。
作者简介
周志湖,电子科技大学计算机软件与理论专业硕士,研究方向为机器学习与模式识别,目前供职于绿城房地产集团信息管理部,担任平台架构师、数据开发主管。对传统数据仓库、基于Hadoop和Spark的大数据仓库架构有深入的研究。
牛亚真,中国科学院大学计算机信息处理与检索方向硕士,Hadoop大数据工程师,目前主要从事分布式环境下的数据分析、数据挖掘相关工作。
内页插图
目录
第1章 Scala入门 1
1.1 Scala简介 2
1.2 Scala开发环境搭建 2
1.2.1 软件准备 2
1.2.2 JDK的安装与配置 3
1.2.3 Scala SDK的安装与配置 5
1.2.4 Intellij IDEA的安装与配置 6
1.3 Scala Hello World 8
1.3.1 创建Scala Project 8
1.3.2 配置项目代码目录结构 9
1.3.3 创建应用程序对象 11
1.3.4 运行代码 12
1.4 Intellij IDEA常用快捷键 13
1.4.1 代码编辑类常用快捷键 13
1.4.2 导航快捷键 14
1.4.3 编译、运行及调试 15
1.4.4 代码格式化 15
1.5 交互式命令行使用 15
1.5.1 Scala内置交互式命令行 15
1.5.2 Scala Console交互式命令行 17
1.5.3 Scala Worksheet的使用 19
小 结 20
第2章 变量及基本数据类型 21
2.1 变 量 22
2.1.1 变量定义 22
2.1.2 lazy变量 23
2.2 基本数据类型 24
2.2.1 Int类型 24
2.2.2 Float类型 25
2.2.3 Double类型 25
2.2.4 Char类型 25
2.2.5 String类型 26
2.2.6 Boolean类型 27
2.3 基本类型操作 27
2.3.1 算术运算操作 27
2.3.2 关系运算操作 28
2.3.3 逻辑运算操作 28
2.3.4 位运算操作 29
2.3.5 对象比较运算操作 30
2.3.6 字符串运算操作 31
2.4 运算符的优先级 32
2.5 元组类型 33
2.6 符号类型 34
小 结 35
第3章 程序控制结构 36
3.1 if语句 37
3.1.1 if语句 37
3.1.2 if… else…语句 37
3.1.3 if...else if...else…语句 37
3.1.4 if的嵌套使用 38
3.1.5 if表达式 39
3.2 while 循环语句 39
3.2.1 while语句的使用 39
3.2.2 do while语句的使用 40
3.3 for循环语句 41
3.3.1 基础for循环 41
3.3.2 有过滤条件的for循环 44
3.3.3 多重for循环 44
3.3.4 作为表达式的for循环 45
小 结 45
第4章 集 合 46
4.1 集合简介 47
4.2 数 组 49
4.2.1 定长数组 49
4.2.2 变长数组 ArrayBuffer 50
4.2.3 数组的遍历 52
4.2.4 遍历生成数组 53
4.2.5 常用函数 53
4.3.6 多维数组 54
4.3 列 表(List) 55
4.3.1 列表的创建 55
4.3.2 List常用函数 56
4.3.3 List伴生对象方法 58
4.4 集(Set) 59
4.5 映 射(Map) 61
4.6 队 列(Queue) 63
4.7 栈(Stack) 64
小 结 66
第5章 函 数 67
5.1 函 数 68
5.2 值 函 数 69
5.2.1 值函数的定义 69
5.2.2 值函数的简化 71
5.3 高阶函数 73
5.3.1 高阶函数的定义 73
5.3.2 高阶函数的使用 74
5.4 闭 包 78
5.5 函数柯里化 80
5.6 部分应用函数 81
5.7 偏 函 数 83
小 结 85
第6章 Scala面向对象编程(上) 86
6.1 类与对象 87
6.1.1 类的定义 87
6.1.2 创建对象 88
6.1.3 类成员的访问 88
6.1.4 单例对象 90
6.1.5 应用程序对象 91
6.1.6 伴生对象与伴生类 93
6.2 主构造函数 96
6.2.1 主构造函数的定义 96
6.2.2 默认参数的主构造函数 98
6.2.3 私有主构造函数 99
6.3 辅助构造函数 100
6.3.1 辅助构造函数的定义 100
6.3.2 辅助构造函数中的默认参数 102
6.4 继承与多态 104
6.4.1 类的继承 104
6.4.2 构造函数执行顺序 107
6.4.3 方法重写 108
6.4.4 多态 109
6.5 成员访问控制 111
6.5.1 默认访问控制 112
6.5.2 protected访问控制 113
6.5.3 private访问控制 114
6.5.4 private[this]访问控制 116
6.5.5 主构造函数中的成员访问控制 121
6.6 抽象类 125
6.6.1 抽象类的定义 125
6.6.2 抽象类的使用 126
6.7 内部类与内部对象 128
6.8 匿名类 130
小 结 131
第7章 Scala面向对象编程(下) 132
7.1 trait简介 133
7.2 trait 的使用 135
7.2.1 trait的几种不同用法 135
7.2.2 混入trait的类对象构造 138
7.2.3 提前定义与懒加载 140
7.3 trait与类 144
7.3.1 trait与类的相似点 144
7.3.1 trait与类的不同点 146
7.4 多重继承问题 147
7.5 自身类型 148
小 结 151
第8章 包(package) 152
8.1 包的定义 153
8.2 包的使用和作用域 155
8.2.1 包的使用 155
8.2.2 包作用域 156
8.3 包 对 象 159
8.4 import高级特性 160
8.4.1 隐式引入 160
8.4.2 引入重命名 160
8.4.3 类隐藏 161
小 结 162
第9章 模式匹配 163
9.1 模式匹配简介 164
9.2 模式匹配的7大类型 167
9.2.1 常量模式 167
9.2.2 变量模式 167
9.2.3 构造函数模式 169
9.2.4 序列模式 170
9.2.5 元组模式 171
9.2.6 类型模式 172
9.2.7 变量绑定模式 173
9.3 模式匹配原理 174
9.3.1 构造函数模式匹配原理 174
9.3.2 序列模式匹配原理 176
9.4 正则表达式与模式匹配 177
9.4.1 Scala正则表达式 177
9.4.2 正则表达式在模式匹配中的应用 180
9.5 for循环中的模式匹配 183
9.6 模式匹配与样例类、样例对象 185
9.6.1 模式匹配与样例类 185
9.6.2 模式匹配与样例对象 187
小 结 190
第10章 隐式转换 191
10.1 隐式转换简介 192
10.2 隐式转换函数 193
10.2.1 隐式转换函数的定义 193
10.2.2 隐式转换函数名称 194
10.3 隐式类与隐式对象 195
10.3.1 隐式类 195
10.3.2 隐式对象 196
10.4 隐式参数与隐式值 197
10.4.1 隐式参数 197
10.4.2 隐式值 199
10.4.3 隐式参数使用常见问题 201
10.5 隐式转换规则与问题 204
10.5.1 隐式转换的若干规则 204
10.5.2 隐式转换需注意的问题 208
小 结 210
第11章 类型参数 211
11.1 类与类型 212
11.2 泛 型 214
11.2.1 泛型类 215
11.2.2 泛型接口与泛型方法 216
11.2.3 类型通配符 217
11.3 类型变量界定 220
11.4 视图界定 222
11.5 上下文界定 223
11.6 多重界定 226
11.7 协变与逆变 227
11.8 高级类型 230
11.8.1 单例类型 231
11.8.2 类型投影 235
11.8.3 类型别名 237
11.8.4 抽象类型 238
11.8.5 复合类型 240
11.8.6 函数类型 241
小 结 243
第12章 Scala并发编程基础 244
12.1 Scala并发编程简介 245
12.1.1 重要概念 245
12.1.2 Actor模型 247
12.1.3 Akka并发编程框架 247
12.2 Actor 249
12.2.1 定义Actor 249
12.2.2 创建Actor 250
12.2.3 消息处理 255
12.2.4 Actor的其他常用方法 260
12.2.5 停止Actor 261
12.3 Typed Actor 265
12.3.1 Typed Actor定义 265
12.3.2 创建Typed Actor 266
12.3.3 消息发送 267
12.3.4 停止运行Typed Actor 269
12.4 Dispatcher 271
12.4.1 常用Dispatcher 271
12.4.2 ExecutionService 274
12.5 Router 277
12.6 容 错 279
12.6.1 Actor的4种容错机制 279
12.6.2 Supervison 279
小 结 285
第13章 Scala与Java的互操作 286
13.1 Java与Scala集合互操作 287
13.1.1 Java调用Scala集合 287
13.1.2 Scala调用Java集合 288
13.1.3 Scala与Java集合间相互转换分析 289
13.2 Scala与Java泛型互操作 290
13.2.1 Scala中使用Java泛型 291
13.2.2 Java中使用Scala泛型 291
13.3 Scala trait在Java中的使用 293
13.4 Scala与Java异常处理互操作 298
小 结 299
参考文献 300
前言/序言
为什么要写这本书
Apache Spark、Apache Kafka等基于Scala语言实现的框架在大数据生态圈内占有举足轻重的地位,它们一定程度上引领着大数据最前沿的技术方向,另外Akka、Apache Gearpump等基于Scala语言实现的框架在大数据生态圈内也备受关注,工业实践已经证明了Scala语言的强大,这使Scala语言近一两年名声大噪,进而引起众多编程语言爱好者及各大公司的亲睐,国内外也因此掀起了一场学习Scala语言的热潮。
Scala语言基于JVM平台,能够与Java语言进行良好地互操作,它最大的特点是可以将面向对象编程语言与函数式编程语言的特点结合起来。Scala语言的简洁性和表达能力,使得Scala语言与Java语言相比,同样的功能用Scala实现代码量要少很多。Scala语言的众多优点,让许多业内名家对其推崇备至,这其中便有Java之父James Gosling和Groovy语言创始人James Strachan。
“If I were to pick a language to use today other than Java, it would be Scala.”[ ](如果现在让我选择使用除Java之外的一门语言的话,那一定是Scala)——Java之父James Gosling
“Though my tip though for the long term replacement of javac is Scala. I'm very impressed with it! I can honestly say if someone had shown me the Programming in Scala book by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy.”(我认为将来可能替代javac的就是Scala ,它极大地震撼了我,老实说如果有人在2003年把Martin Odersky、Lex Spoon和Bill Venners写的那本《Programming in Scala》书拿给我看了的话,那我可能就不会再去发明Groovy语言了)[ ]——Groovy(另一种基于JVM平台的语言)创始人James Strachan。
目前国内Scala方面教材的短缺一定程度上限制了Scala语言在国内的普及,本书试图弥补这一空白。
本书内容
本书是笔者在Scala学习、工作实践及培训过程中的心得体会和系统总结。内容涵盖Scala语言基础知识,包括变量的定义、程序控制结构、Scala集合操作;Scala语言中级知识,包括Scala函数式编程、Scala面向对象编程、Scala模式匹配;Scala语言高级编程知识,包括Scala类型参数、隐式转换、Scala并发编程、Scala与Java互操作。书中利用大量的具体示例和实际案例来说明Scala语言的应用,既能够掌握核心语法,又能够理解其背后的深层次原理。
读者对象
(1)Spark、Kafka等框架二次开发人员
Spark、Kafka等大数据处理框架目前在稳定性、扩展性方面虽然已经取得了长足的进步,但在实际使用时难免遇到问题,此时需要深入到内核源代码中分析问题,在理解其架构原理与实现细节的基础上通过修改内核源代码来解决问题,这需要开发人员有很强的Scala语言功底。
(2)Spark、Kafka等框架应用开发人员
在学习Spark、Kafka等Scala语言实现的大数据技术框架时,这些框架大多都提供了Java、Scala、Python等上层应用API编程接口,但仅仅学会使用其上层API是不够的,因为上层API抽象程度较高,各框架的底层实现细节、设计原理等对开发人员来说是一个黑匣子,在遇到性能等问题时,开发人员如果对底层实现细节不熟悉的话可能很难进行程序的性能优化。
(3)Spark、Kafka等框架运维工程师
目前Spark、Kafka等大数据处理框架基本上已经成为各大公司大数据解决方案的标配,但基于开源解决方案常常会面临一些技术风险,框架本身的问题及实际应用场景的不同可能会遇到很多故障,因此对于这些使用Scala语言实现的框架而言,运维工程师也需要知晓各框架的底层细节,这样才能够迅速定位问题并找到合适的解决办法。
(4)从事大数据技术的Java开发人员
Scala语言完全兼容Java语言,Scala语言中大量使用了Java语言现有的库,因此如果你是一个Java大数据开发人员,在此建议学习Scala语言,相信它会给你带来全新的感受,甚至有抛弃Java的念头。
(5)大数据技术开源爱好者
Spark、Kafka等是大数据技术框架中的明星,Scala语言已经通过了工业界的检验,学习Scala语言为学习这些框架的设计原理打下坚实的基础,为以后参与开源、学习工业界最先进的大数据技术架构的优秀思想打下了坚实的基础。
如何阅读本书
本书涵盖三大主要部分:
(1)Scala语言基础篇,主要介绍Scala语言入门基础知识、变量的定义、程序控制结构、Scala集合。
(2)Scala语言中级篇,主要介绍Scala函数式编程、 Scala面向对象编程、Scala模式匹配。
(3)Scala语言高级篇,主要介绍Scala类型参数、隐式转换、Scala并发编程、Scala与Java互操作。
如果你是一名初学者,请按照书的顺序从第一章基础理论部分开始学习,学习时先认真看书中的代码示例和说明,然后照着代码亲自动手实践,这样可以达到事半功倍的学习效果;如果你是一名Scala资深用户,你可以自由阅读各章内容,相信书中部分内容肯定能够给你带来一些新的启发。
资源下载
本书代码可以从pan.baidu.com/s/1nvyDC1r(注意数字和字母大小写)下载。如果下载有问题,请电子邮件联系booksaga@163.com,邮件标题为“Scala开发快速入门-代码”。
勘误和支持
由于笔者水平有限,加之编写时间仓促,书中难免出现一些错误或不准确的地方,恳请读者批评指正。有任何问题联系,编者将尽最大努力及时为读者提供相应的解答。
编 者
2016年6月于杭州
掌控JVM上的函数式编程艺术:深入理解Scala的强大与优雅 这是一本旨在为开发者开启Scala编程世界大门的指南,它将带领你穿越Scala独特而强大的语法,领略函数式编程范式带来的高效与简洁,最终让你熟练掌握在JVM平台上构建高性能、可维护、可扩展应用程序的必备技能。 在当今快速变化的软件开发领域,选择一门强大的编程语言至关重要。Scala,作为一门融合了面向对象与函数式编程思想的语言,凭借其在处理并发、大数据以及构建复杂系统方面的卓越表现,正日益受到业界的青睐。本书将为你揭示Scala的精髓,让你不再仅仅是“使用”Scala,而是真正“理解”它,并能充分发挥其潜力。 从零开始,构建坚实基础: 本书的起点并非直接跳入高阶概念,而是为你奠定坚实的Scala编程基础。我们将从Scala的基本语法入手,逐步介绍变量、数据类型、控制结构(如条件语句和循环)以及函数定义。你将学习如何编写清晰、简洁的代码,并理解Scala在类型系统上的严谨性。 核心概念的循序渐进: 我们不会一次性抛出大量信息,而是采用循序渐进的学习方式。首先,你将熟悉Scala中最基础的元素,例如如何声明变量,区分可变与不可变数据,理解Scala内置的基本数据类型(如Int, Double, Boolean, String)以及集合类型(如List, Vector, Map, Set)的基本用法。 控制流程的掌握: 无论哪种编程语言,控制流程都是必不可少的。本书将详细讲解Scala的if-else语句、match表达式,以及for推导式和while循环,让你能够灵活地控制程序的执行逻辑。 函数的艺术: 函数是Scala的核心。你将学习如何定义、调用以及传递函数,理解函数作为一等公民的意义。我们将深入探讨函数的参数(包括默认参数、命名参数和变长参数),以及返回值。 拥抱函数式编程的强大力量: Scala最引人注目的特性之一便是其对函数式编程的强大支持。本书将带你深入理解函数式编程的核心思想,并教会你如何将这些思想应用于实际开发中。 不可变性(Immutability): 理解不可变性是掌握函数式编程的关键。我们将详细阐述为什么不可变性如此重要,它如何简化并发编程,避免潜在的副作用,以及如何通过Scala的`val`关键字和不可变集合来实践它。你将学会如何设计无状态的函数,减少代码的复杂性。 纯函数(Pure Functions): 纯函数是函数式编程的基石。本书将解释纯函数的定义——即给定相同的输入,总是产生相同的输出,并且没有任何副作用。你将学习如何识别和编写纯函数,以及它们如何提高代码的可预测性、可测试性和可组合性。 高阶函数(Higher-Order Functions): 函数作为参数传递或作为返回值返回,是函数式编程的强大体现。你将学习`map`, `filter`, `reduce`等常见的高阶函数,理解它们如何优雅地处理集合数据,以及如何使用Lambda表达式(匿名函数)来编写简洁的函数。 递归(Recursion): 在函数式编程中,递归往往取代了传统的迭代循环。本书将为你深入讲解递归的概念,如何设计递归函数,以及尾递归优化在避免栈溢出方面的作用,让你能够用递归的方式解决复杂的计算问题。 模式匹配(Pattern Matching): Scala强大的模式匹配机制是其表达力的重要来源。你将学习如何利用模式匹配来解构数据结构、进行条件判断,以及如何结合case class实现优雅的代码。这使得代码更加清晰、易读,并能有效处理复杂的数据。 深入面向对象的世界: Scala不仅是一门函数式语言,它还是一门完备的面向对象语言。本书将帮助你理解Scala如何将面向对象特性融入其函数式范式之中。 类与对象(Classes and Objects): 你将学习如何定义类,创建对象,以及理解Scala的类成员(字段和方法)。我们将探讨构造函数(包括主构造函数和辅助构造函数),以及如何使用`object`关键字创建单例对象,实现全局唯一实例。 继承与特质(Inheritance and Traits): 继承是面向对象编程的重要概念。本书将介绍Scala的类继承机制,以及特质(Traits)这一Scala特有的强大抽象机制。你将学会如何利用特质实现代码的复用和组合,实现类似多重继承的效果,以及理解特质与抽象类的区别。 封装与多态(Encapsulation and Polymorphism): 你将理解Scala如何通过访问修饰符(如`private`, `protected`, `public`)来实现封装,以及如何通过继承和特质实现多态。 掌握Scala的进阶特性: 当掌握了基础知识后,本书将引导你探索Scala更高级、更具生产力的特性。 集合库的精通: Scala拥有一个功能强大且一致的集合库。你将深入了解各种集合类型的特性,掌握如何高效地使用`map`, `flatMap`, `filter`, `fold`, `groupBy`等操作来处理数据,以及理解惰性集合(Lazy Collections)带来的性能优势。 Option类型: NullPointerException是许多语言的噩梦。Scala的`Option`类型提供了一种安全处理可能缺失值的方式,本书将详细讲解`Some`和`None`,以及如何利用`map`, `flatMap`, `getOrElse`等方法安全地访问和处理可能不存在的值,极大地提升代码的健壮性。 Case Classes与模式匹配的深度运用: Case Class是Scala中用于表示不可变数据的强大工具,结合模式匹配,可以实现非常简洁和富有表现力的代码。你将学习如何定义case class,以及如何使用它们与模式匹配来处理复杂的数据结构,例如解析JSON或XML。 并发编程(Concurrency): 在多核时代,并发编程是构建高性能应用程序的关键。本书将介绍Scala的并发模型,包括`Future`和`Promise`,以及如何利用Actor模型(如Akka)来构建高并发、分布式系统,让你能够自信地处理并发带来的挑战。 泛型编程(Generics): 泛型是实现代码复用和类型安全的关键。你将学习如何定义泛型类、泛型函数,理解类型擦除(Type Erasure)和类型边界(Type Bounds),以及如何使用泛型来构建更加灵活和可重用的组件。 实战应用与最佳实践: 理论知识的学习最终需要落地到实际项目中。本书将穿插大量的代码示例和练习,帮助你巩固所学知识,并逐步培养良好的Scala编程习惯。 示例驱动的学习: 每一个概念都配有清晰、可运行的代码示例,让你能够亲手实践,加深理解。 案例分析: 通过分析一些实际的开发场景,展示Scala如何在这些场景下发挥优势,例如如何使用Scala构建RESTful API、如何进行数据处理等。 代码风格与设计模式: 除了语言特性,本书还将引导你了解Scala社区推崇的代码风格和一些常用的设计模式,帮助你写出更具可读性、可维护性和高性能的代码。 本书的目标读者: 希望提升编程效率和代码质量的Java开发者: 如果你熟悉Java,本书将为你提供一条平滑过渡到Scala的路径,让你能够利用Scala的函数式特性和简洁语法来改进现有项目。 初次接触Scala的编程新手: 本书的循序渐进的教学方法,即使是编程新手也能轻松上手,并建立起对Scala的全面认知。 寻求更强大JVM语言的开发者: 如果你正在寻找一门能在JVM平台上处理复杂业务逻辑、大数据以及高并发场景的语言,Scala将是你的理想选择。 对函数式编程感兴趣的开发者: 本书将深入浅出地讲解函数式编程的核心概念,并演示如何在Scala中将其付诸实践。 通过阅读本书,你将不仅掌握Scala这门语言本身,更重要的是,你将学会一种全新的、更优雅、更高效的编程思维方式,这无论对于你当前的项目还是未来的职业发展,都将产生深远的影响。让我们一起踏上Scala的探索之旅,解锁JVM上的函数式编程艺术!