《Scala编程》PDF下载

  • 购买积分:15 如何计算积分?
  • 作  者:(美)奥德斯基,(美)莱斯彭,(美)凡纳斯著
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2010
  • ISBN:9787121121197
  • 页数:494 页
图书介绍:本书以Scala这一新生的多范式面向对象编程语言主题背景,系统地讲述了如何使用Scala编程语言进行程序开发工作,如何利用Scala的actor模型在JVM上设计具伸缩性的并发应用程序。它详细讲述了Scala语言中轻量级的函数语法、高阶、嵌套、局部套用(Currying)、匿名、与XML集成等特性,并指导读者在Scala程序中直接书写XML,将XML转换成Scala类,实现与Java无缝地互操作等。

目录概览 3

第1章 可伸展的语言 3

第2章 Scala入门初探 15

第3章 Scala入门再探 23

第4章 类和对象 37

第5章 基本类型和操作 47

第6章 函数式对象 61

第7章 内建控制结构 73

第8章 函数和闭包 89

第9章 控制抽象 103

第10章 组合与继承 113

第11章 Scala的层级 131

第12章 特质 137

第13章 包和引用 151

第14章 断言和单元测试 161

第15章 样本类和模式匹配 171

第16章 使用列表 193

第17章 集合类型 215

第18章 有状态的对象 233

第19章 类型参数化 249

第20章 抽象成员 265

第21章 隐式转换和参数 285

第22章 实现列表 301

第23章 重访For表达式 309

第24章 抽取器(Extractors) 321

第25章 注解 331

第26章 使用XM L 335

第27章 使用对象的模块化编程 345

第28章 对象相等性 355

第29章 结合Scala和Java 373

第30章 Actor和并发 383

第31章 连结符解析 407

第32章 GUI编程 427

第33章 Scell试算表 435

附录A Unix和Windows的Scala脚本 453

术语表 455

参考文献 465

关于作者 467

索引 469

图示清单 18

图2.1 Scala函数的基本构成 18

图2.2 Scala函数字面量的语法 22

图3.1 Scala里所有的操作符都是方法调用 24

图3.2 Scala的Set类层级 30

图3.3 Scala的Map类层级 31

图10.1 ArrayElement的类关系图 116

图10.2 LineElement的类关系图 120

图10.3 布局元素的类层级 121

图10.4 修改了LineElement后的类层级 124

图11.1 Scala类层级图 132

图12.1 Cat类的继承层级和线性化次序 147

图14.1 ScalaTest的图形报表器 169

图17.1 Scala集合类型的类层级 215

图17.2 Iterator的类层级 216

图18.1 基本门电路 237

图18.2 半加法电路 238

图18.3 全加法电路 239

图19.1 函数类型参数中的协变与逆变 261

图22.1 Scala列表的类层级 302

图22.2 展示的Scala列表构造 304

图32.1 一个简单的Swing应用程序:初始状态(左)和拉大之后的状态(右) 428

图32.2 一个有反应的Swing应用程序:初始状态(左)及点击后的状态(右) 429

图32.3 摄氏度与华氏度之间的转换器 432

图33.1 一个简单的试算表表格 436

图33.2 显示自身的单元格 439

图33.3 显示方程式的单元格 444

图33.4 可以求值的单元格 448

表格清单 27

表3.1 List的一些方法和作用 27

表5.1 一些基本类型 47

表5.2 特殊字符字面量转义序列 50

表5.3 操作符优先级 59

表5.4 一些富操作 60

表5.5 富包装类 60

表12.1 Cat层级中类型的线性化 148

表13.1 LegofJourney.distance上的私有限定符效果 159

表16.1 基本列表操作 195

表17.1 集的常用操作 222

表17.2 映射的常用操作 223

表17.3 默认的不可变集实现 225

表17.4 默认的不可变映射实现 225

表31.1 解析器连结符汇总 415

代码清单 23

清单3.1 用类型参数化数组 23

清单3.2 创造和初始化数组 25

清单3.3 创造和初始化列表 26

清单3.4 创造和使用元组 28

清单3.5 创造、初始化和使用不可变集 29

清单3.6 创建、初始化和使用可变集 30

清单3.7 创造、初始化和使用可变映射 31

清单3.8 创造、初始化和使用不可变映射 32

清单3.9 没有副作用或var的函数 33

清单3.10 从文件中读入行 34

清单3.11 对文件的每行记录打印格式化的字符数量 36

清单4.1 类ChecksumAccumulator的最终版 40

清单4.2 类ChecksumAccumulator的伴生对象 42

清单4.3 程序Summer 43

清单4.4 使用Application特质 45

清单6.1 带字段的Rational 64

清单6.2 带有从构造器的Rational 66

清单6.3 带私有字段和方法的Rational 67

清单6.4 带操作符方法的Rational 68

清单6.5 含有重载方法的Rational 71

清单7.1 在Scala里根据条件做初始化的惯例 74

清单7.2 用while循环计算最大公约数 74

清单7.3 用do-while从标准输入读取信息 75

清单7.4 使用递归计算最大公约数 75

清单7.5 用for表达式列举目录中的文件 76

清单7.6 用带过滤器的for发现.scala文件 77

清单7.7 在for表达式中使用多个过滤器 78

清单7.8 在for表达式中使用多个发生器 78

清单7.9 在for表达式里的流间赋值 78

清单7.10 用for把Array[File]转换为Array[Int] 79

清单7.11 Scala的try-catch子句 80

清单7.12 Scala的try-finally子句 81

清单7.13 能够产生值的catch子句 82

清单7.14 有副作用的match表达式 82

清单7.15 生成值的match表达式 83

清单7.16 不带break或continue的循环 84

清单7.17 不用var做循环的递归替代方法 84

清单7.18 打印乘法表时的变量范围 85

清单7.19 创建乘法表的函数式方法 87

清单8.1 带私有的processLine方法的LongLines对象 89

清单8.2 带局部processLine方法的LongLines 91

清单9.1 使用闭包减少代码重复 105

清单9.2 定义和调用“陈旧的”函数 107

清单9.3 定义和调用柯里化的函数 107

清单9.4 使用借贷模式写文件 110

清单9.5 使用传名参数 111

清单10.1 定义抽象方法和类 114

清单10.2 定义无参数方法width和height 114

清单10.3 定义ArrayElement为Element的子类 116

清单10.4 用字段重写无参数方法 117

清单10.5 定义contents为参数化字段 118

清单10.6 调用超类构造器 119

清单10.7 声明final方法 123

清单10.8 声明final类 123

清单10.9 带有above、beside和toString的类Element 126

清单10.10 带有工厂方法的工厂对象 127

清单10.11 重构以使用工厂方法的类Element 127

清单10.12 用私有类隐藏实现 128

清单10.13 有了widen和heighten方法的Element 129

清单10.14 Spiral程序 130

清单12.1 Philosophical特质的定义 137

清单12.2 使用extends混入特质 137

清单12.3 使用with混入特质 138

清单12.4 混入多个特质 138

清单12.5 定义丰满了的特质 141

清单12.6 抽象类IntQueue 143

清单12.7 使用ArrayBuffer实现BasicIntQueue 143

清单12.8 Doubling可堆叠改动特质 144

清单12.9 在使用new实例化的时候混入特质 145

清单12.10 可堆叠改动特质Incrementing和Filtering 145

清单13.1 把文件的全部内容放进包里 151

清单13.2 同一个文件嵌入不同的包 152

清单13.3 较少缩进的嵌入包 152

清单13.4 Scala的包确实是嵌套的 152

清单13.5 访问隐藏的包名 153

清单13.6 鲍勃最爱的水果,已为引用做好准备 154

清单13.7 引用规范的(不是单例)对象的成员 154

清单13.8 引用包名 155

清单13.9 Scala和Java的private访问差异 157

清单13.10 Scala和Java的protected访问差异 157

清单13.11 使用访问修饰词的灵活的保护作用域 158

清单13.12 访问伴生类和对象的私有成员 160

清单14.1 使用断言 161

清单14.2 使用ensuring断言函数结果 162

清单14.3 使用Suite编写测试方法 162

清单14.4 使用FunSuite编写测试函数 163

清单14.5 使用JUnit3Suite编写JUnit测试 165

清单14.6 使用TestNGSuite编写TestNG测试 165

清单14.7 使用ScalaTest的Spec规格化和测试行为 166

清单14.8 使用specs架构规格化和测试行为 167

清单14.9 使用ScalaCheck编写基于属性的测试 167

清单14.10 使用Checkers在JUnit的TestCase里检查属性 168

清单15.1 定义样本类 171

清单15.2 simplifyTop函数,使用了模式匹配 173

清单15.3 带有空“默认”情况的模式匹配 174

清单15.4 使用通配模式的模式匹配 174

清单15.5 使用常量模式的模式匹配 175

清单15.6 使用变量模式的模式匹配 175

清单15.7 带有构造器模式的模式匹配 176

清单15.8 有固定长度的序列模式 177

清单15.9 匹配任意长度的序列模式 177

清单15.10 带有元组模式的模式匹配 177

清单15.11 带有类型化模式的模式匹配 177

清单15.12 使用isInstanceOf和asInstanceOf(不好的风格) 178

清单15.13 带有变量绑定(用@符号)的模式 180

清单15.14 带有模式守卫的match表达式 180

清单15.15 样本依次被调用的匹配表达式 181

清单15.16 封闭了的样本类层级 182

清单15.17 用一个赋值语句定义多个变量 184

清单15.18 带有元组模式的for表达式 186

清单15.19 从列表中拣出匹配于模式的元素 187

清单15.20 表达式格式化器的上半截 189

清单15.21 表达式格式化器的下半截 190

清单15.22 输出格式化了的表达式的应用程序 191

清单16.1 List类的归并排序 203

清单17.1 Predef中定义的默认映射和集 221

清单17.2 混入SynchronizedMap特质 226

清单18.1 可变的银行账号类 233

清单18.2 带有公开var变量的类 235

清单18.3 公开的var变量是如何扩展为getter和setter方法的 235

清单18.4 直接定义getter和setter方法 236

清单18.5 定义不带关联字段的getter和setter 236

清单18.6 halfAdder方法 239

清单18.7 fullAdder方法 239

清单18.8 Simulation类 240

清单18.9 BasicCircuitSimulation类的前半部分 243

清单18.10 BasicCircuitSimulation类的后半部分 244

清单18.11 CircuitSimulation类 246

清单19.1 基本的函数式队列 251

清单19.2 通过私有化隐藏主构造器 251

清单19.3 伴生对象的apply工厂方法 252

清单19.4 数式队列的类型抽象 253

清单19.5 非协变(严谨)的Cell类 254

清单19.6 带有下界的类型参数 258

清单19.7 逆变的输出通道 259

清单19.8 Functionl的协变和逆变 260

清单19.9 函数类型参数变化型的演示 261

清单19.10 优化了的函数式队列 262

清单19.11 混入了Ordered特质的Person类 263

清单19.12 带有上界的归并排序 264

清单20.1 重写的抽象val及无参方法 267

清单20.2 声明抽象var 267

清单20.3 抽象var是如何被扩展为getter和setter方法的 267

清单20.4 使用了抽象val的特质 268

清单20.5 匿名类表达式中的预初始化字段 269

清单20.6 对象定义中的预初始化字段 270

清单20.7 类定义中的预初始化字段 270

清单20.8 使用懒加载val初始化特质 271

清单20.9 用抽象类型建模合适的食物 274

清单20.10 在子类中实现抽象类型 274

清单20.11 美国货币区域 281

清单20.12 欧洲和日本的货币区域 282

清单20.13 带有汇率表的转换器对象 282

清单20.14 CurrencyZone的完整代码 283

清单21.1 带多个参数的隐式参数列表 293

清单21.2 带有上界的函数 294

清单21.3 带有隐式参数的函数 295

清单21.4 使用了内部隐式参数的函数 296

清单21.5 带有视界的函数 297

清单21.6 使用隐式参数的样例代码 299

清单21.7 完成类型检查和隐式内容插入之后的样例代码 299

清单22.1 Nil单例对象的定义 302

清单22.2 在子类型列表上前缀超类型元素 304

清单22.3 List类的::(cons)方法定义 304

清单22.4 List类的:::方法定义 305

清单22.5 List类的map方法定义 306

清单22.6 List子类::的定义 307

清单24.1 EMail字符串抽取器对象 322

清单24.2 Twice字符串抽取器对象 324

清单24.3 UpperCase字符串抽取器对象 324

清单24.4 Domain字符串抽取器对象 325

清单24.5 ExpandedEMail抽取器对象 326

清单24.6 定义了unapplySeq方法的抽取器 327

清单24.7 RichString是如何定义r方法的 329

清单27.1 简化的Food实体类 346

清单27.2 简化的Recipe实体类 347

清单27.3 可以用于测试的Food和Recipe例子 347

清单27.4 仿制的数据库和浏览器模块 347

清单27.5 添加了类别的数据库和浏览器模块 348

清单27.6 带抽象数据库val字段的Browser类 349

清单27.7 带抽象方法的Database类 349

清单27.8 Database的子类对象SimpleDatabase 350

清单27.9 Browser子类对象SimpleBrowser 350

清单27.10 学生数据库与浏览器 350

清单27.11 食品分类的特质 351

清单27.12 混入了FoodCategories特质的Database 351

清单27.13 仅由混入组成的SimpleDatabase对象 351

清单27.14 SimpleFoods特质 351

清单27.15 带有自身类型的SimpleRecipes 352

清单27.17 使用单例类型 354

清单28.1 调用canEqual的超类equals方法 363

清单28.2 调用canEqual的子类equals方法 364

清单28.3 二叉树的类继承关系 365

清单28.4 带有equals和hashCode方法的参数化类型 368

清单28.5 带有equals和hashCode的Rational类 369

清单29.1 声明了Java throws语句的Scala方法 376

清单30.1 一个简单的actor 384

清单30.2 调用receive的actor 386

清单30.3 调用react的actor 389

清单30.4 使用loop的actor方法act 389

清单30.5 使用助手actor来避免阻塞自己的actor 391

清单30.6 使用样本类作为消息的actor 394

清单30.7 Simulant特质 399

清单30.8 加法器组件 404

清单31.1 一个算术表达式解析器 408

清单31.2 针对Java标识符的正则表达式解析器 410

清单31.3 JSON格式的数据 411

清单31.4 一个简单的JSON解析器 411

清单31.5 返回有意义的结果的完整JSON解析器 414

清单31.6 ~连结符方法 419

清单32.1 一个用Scala编写的简单Swing应用程序 427

清单32.2 在面板上组装组件 429

清单32.3 实现一个有反应的Swing应用程序 432

清单32.4 温度转换器的一个实现 433

清单33.1 图33.1中的试算表的代码 436

清单33.2 试算表应用程序的主程序 437

清单33.3 带有rendererComponent方法的试算表 438

清单33.4 第一版的Model类 438

清单33.5 代表公式的类 440

清单33.6 解析公式的试算表 443

清单33.7 Evalutor特质的evaluate方法 445

清单33.8 一个算术操作库 446

清单33.9 完成的试算表组件 451