Scala编程实战
Alvin Alexander
马博文, 张锦文, 任晓君 译
出版时间:2016年06月
页数:642
本书向读者介绍如何省时省力地使用Scala构建面向对象、函数式、并发应用。书中囊括250个实用技巧以及700多个代码实例,覆盖了开始学习Scala语言、类库和工具时最常见的问题。本书可作为学习使用JVM语言的理想参考书,同时也适用于有经验的Scala开发者。
Alvin Alexander(devdaily.com创始人)使用Scala构建可扩展性高、基于组件的并行和分布式应用,将大量实用经验汇集在本书中。结合真实的使用场景,为读者提供了以下实用技巧:
● 字符串、数值类型和控制结构
● 类、方法、对象、特质和包
● 多种情况下的函数式编程
● Scala丰富的集合类及方法
● 使用Akka类库进行并发
● 使用Scala REPL以及SBT构建工具
● 客户端和服务器端的Web服务
● 与SQL和NoSQL数据库交互
● Scala开发的最佳实践
  1. 前言
  2. 第1章 字符串
  3. 1.1 测试字符串的相等性
  4. 1.2 创建多个字符串
  5. 1.3 分隔字符串
  6. 1.4 字符串中的变量代换
  7. 1.5 挨个处理字符串中的字符
  8. 1.6 字符串中的查找模式
  9. 1.7 字符串中的替换模式
  10. 1.8 抽取String中模式匹配的部分
  11. 1.9 访问字符串中的一个字符
  12. 1.10 在String类中添加自定义的方法
  13. 第2章 数值
  14. 2.1 从字符串到数值
  15. 2.2 数值类型转换
  16. 2.3 重载默认数值类型
  17. 2.4 替代++和--
  18. 2.5 浮点数的比较
  19. 2.6 处理大数
  20. 2.7 生成随机数
  21. 2.8 创建一个数值区间、列表或者数组
  22. 2.9 格式化数值和金额
  23. 第3章 控制结构
  24. 3.1 for和foreach循环
  25. 3.2 在for循环中使用多个计数器
  26. 3.3 在for循环中嵌入if语句(卫语句)
  27. 3.4 创建for表达式(for/yield组合)
  28. 3.5 实现break和continue
  29. 3.6 像三元运算符一样使用if
  30. 3.7 像switch语句一样使用匹配表达式
  31. 3.8 一条case语句匹配多个条件
  32. 3.9 将匹配表达式的结果赋值给变量
  33. 3.10 访问匹配表达式缺省case的值
  34. 3.11 在匹配表达式中使用模式匹配
  35. 3.12 在匹配表达式中使用Case 类
  36. 3.13 给Case语句添加if表达式(卫语句)
  37. 3.14 使用匹配表达式替换isInstanceOf
  38. 3.15 在匹配表达式中使用List
  39. 3.16 用try/catch匹配一个或者更多的异常
  40. 3.17 在try/catch/finally块中使用变量前定义变量
  41. 3.18 创建自定义控制结构
  42. 第4章 类和属性
  43. 4.1 创建一个主构造函数
  44. 4.2 控制构造函数字段的可见性
  45. 4.3 定义辅助构造函数
  46. 4.4 定义私有的主构造函数
  47. 4.5 设置构造函数参数的默认值
  48. 4.6 覆写默认的访问和修改方法
  49. 4.7 阻止生成getter和setter方法
  50. 4.8 将代码块或者函数赋给字段
  51. 4.9 设置未初始化的var字段类型
  52. 4.10 在继承类时处理构造函数参数
  53. 4.11 调用父类的构造函数
  54. 4.12 何时使用抽象类
  55. 4.13 在抽象基类(或者特质)里定义属性
  56. 4.14 用Case类生成模板代码
  57. 4.15 定义一个equals方法(对象的相等性)
  58. 4.16 创建内部类
  59. 第5章 方法
  60. 5.1 控制方法作用域
  61. 5.2 调用父类的方法
  62. 5.3 方法参数默认值
  63. 5.4 使用参数名
  64. 5.5 定义一个返回多个值(Tuples)的方法
  65. 5.6 调用getter/setter方法时不使用括号
  66. 5.7 创建接受变参的方法
  67. 5.8 方法的异常声明
  68. 5.9 支持链式调用编码风格
  69. 第6章 对象
  70. 6.1 对象的强制转换
  71. 6.2 Java.class的Scala等价类
  72. 6.3 确定对象所属的类
  73. 6.4 用Object启动一个应用
  74. 6.5 用object创建单例
  75. 6.6 用伴生类创建静态成员
  76. 6.7 将通用代码放入包对象
  77. 6.8 不使用new关键字创建对象实例
  78. 6.9 在Scala中用apply方法实现工厂方法
  79. 第7章 包和导入
  80. 7.1 花括号风格的包记号法
  81. 7.2 引入一个或多个成员
  82. 7.3 在导入时重命名成员
  83. 7.4 在引入时隐藏一个类
  84. 7.5 使用静态导入
  85. 7.6 在任意地方使用Import语句
  86. 第8章 特质
  87. 8.1 特质用作接口
  88. 8.2 使用特质中的抽象字段和实际字段
  89. 8.3 像抽象类一样使用特质
  90. 8.4 简单混入特质
  91. 8.5 通过继承来限制特质的使用范围
  92. 8.6 限定特质只可用于指定类型的子类
  93. 8.7 保证特质只能被添加到只有一个特定方法的类型
  94. 8.8 为对象实例中添加特质
  95. 8.9 像特质一样继承一个Java接口
  96. 第9章 函数式编程
  97. 9.1 使用函数字面量(匿名函数)
  98. 9.2 将函数作为变量
  99. 9.3 定义接受简单函数作为参数的方法
  100. 9.4 更多复杂的函数
  101. 9.5 使用闭包
  102. 9.6 使用部分应用函数
  103. 9.7 创建返回函数的函数
  104. 9.8 创建部分应用函数
  105. 9.9 一个真实的例子
  106. 第10章 集合
  107. 10.1 理解集合的层级结构
  108. 10.2 选择一个集合类
  109. 10.3 用一个集合方法解决一个问题
  110. 10.4 理解集合的性能
  111. 10.5 在创建集合时声明一个类型
  112. 10.6 理解可变变量与不可变集合
  113. 10.7 将Vector“变为”不可变序列
  114. 10.8 把ArrayBuffer作为可变序列的第一选择
  115. 10.9 用foreach遍历一个集合
  116. 10.10 用for循环遍历一个集合
  117. 10.11 使用zipWithIndex或者zip创建循环计数器
  118. 10.12 迭代器的使用
  119. 10.13 用for/yield实现集合间的转换
  120. 10.14 用map实现集合的变换
  121. 10.15 展平列表的列表与扁平化问题
  122. 10.16 map,flatten和flatMap的组合
  123. 10.17 用filter过滤一个集合
  124. 10.18 从集合中提取元素序列
  125. 10.19 序列的分割(groupBy 、partition等)
  126. 10.20 用reduce和fold方法遍历集合
  127. 10.21 从序列中提取不重复的元素
  128. 10.22 合并序列集合
  129. 10.23 用zip将两个序列集合合并为一对
  130. 10.24 在集合上创建一个惰性视图
  131. 10.25 利用Range创建集合
  132. 10.26 创建使用枚举
  133. 10.27 当需要一堆元素时使用元组
  134. 10.28 集合排序
  135. 10.29 通过mkString将集合转换成字符串
  136. 第11章 列表、数组、映射、集及其他
  137. 11.1 创建和填充列表的不同方式
  138. 11.2 创建可变List
  139. 11.3 为List添加元素
  140. 11.4 从List(或者ListBuffer)中删除元素
  141. 11.5 合并或连接列表
  142. 11.6 使用List的懒惰版本,Stream
  143. 11.7 创建和更新数组的不同方式
  144. 11.8 创建大小可变的数组(ArrayBuffer)
  145. 11.9 删除Array和ArrayBuffer的元素
  146. 11.10 数组排序
  147. 11.11 创建多维数组
  148. 11.12 创建映射
  149. 11.13 选择一种Map实现
  150. 11.14 为可变映射添加、更新或删除元素
  151. 11.15 为不可变映射添加、更新或删除元素
  152. 11.16 访问映射的值
  153. 11.17 遍历映射
  154. 11.18 从映射中获得所有的键或者值
  155. 11.19 反转键值
  156. 11.20 测试映射中键/值的存在
  157. 11.21 过滤映射
  158. 11.22 根据键或者值对映射排序
  159. 11.23 找到映射中最大的键或者值
  160. 11.24 给集添加元素
  161. 11.25 从集中删除元
  162. 11.26 使用可排序集
  163. 11.27 使用队列
  164. 11.28 使用栈
  165. 11.29 使用Range
  166. 第12章 文件和进程
  167. 12.1 如何打开和读取文本文件
  168. 12.2 写入文本文件
  169. 12.3 读写二进制文件
  170. 12.4 如何处理文本文件中的每个字符
  171. 12.5 如何处理CSV文件
  172. 12.6 将字符串伪装为文件
  173. 12.7 使用序列化
  174. 12.8 列出目录中的文件
  175. 12.9 列举目录之下的子目录
  176. 12.10 执行外部命令
  177. 12.11 执行外部命令并使用标准输出
  178. 12.12 处理外部命令的标准输出和标准错误输出
  179. 12.13 构建命令管道
  180. 12.14 重定向外部命令的标准输出和标准输入
  181. 12.15 在进程中使用AND(&&)和OR(||)
  182. 12.16 外部命令中处理通配符
  183. 12.17 如何在不同目录下运行进程
  184. 12.18 在运行命令时设置环境变量
  185. 12.19 执行外部命令的方法索引
  186. 第13章 Actors和并发
  187. 13.1 Actor简单入门
  188. 13.2 创建构造函数有参数的actor
  189. 13.3 Actor之间如何通信
  190. 13.4 理解Akka Actor生命周期方法
  191. 13.5 启动Actor
  192. 13.6 停止Actors
  193. 13.7 关闭Akka Actor系统
  194. 13.8 用watch监控Actor的死亡
  195. 13.9 Futures的简单并发
  196. 13.10 给Actor发消息并等待回复
  197. 13.11 用become切换不同状态
  198. 13.12 使用并发集合
  199. 第14章 命令行任务
  200. 14.1 Scala REPL初体验
  201. 14.2 往REPL中粘贴和加载代码块
  202. 14.3 在REPL的Classpath中添加JAR文件和类
  203. 14.4 在REPL中运行Shell命令
  204. 14.5 用scalac命令编译,scala命令运行
  205. 14.6 反汇编和反编译Scala代码
  206. 14.7 寻找Scala类库
  207. 14.8 用scaladoc生成文档
  208. 14.9 更快的命令行编译器fsc
  209. 14.10 将Scala作为脚本语言使用
  210. 14.11 通过脚本访问命令行参数
  211. 14.12 在Scala shell脚本中输入提示
  212. 14.13 让Scala脚本运行得更快
  213. 第15章 Web服务
  214. 15.1 从Scala对象中创建JSON字符串
  215. 15.2 从包含集合的类中生成JSON字符串
  216. 15.3 从JSON字符串生成简单Scala对象
  217. 15.4 将JSON数据解析成为对象的数组
  218. 15.5 用Scalatra创建Web服务
  219. 15.6 用Scalatra挂载替换XML Servlet映射
  220. 15.7 访问Scalatra Web服务的GET参数
  221. 15.8 用Scalatra处理POST请求数据
  222. 15.9 创建一个简单的GET请求客户端
  223. 15.10 向POST链接发送JSON数据
  224. 15.11 获取URL Headers
  225. 15.12 发送请求时设置链接的Headers
  226. 15.13 用Play框架创建一个GET请求的Web服务
  227. 15.14 向Play框架的web服务POST JSON数据
  228. 第16章 数据库和持久化
  229. 16.1 用JDBC连接MySQL
  230. 16.2 用Spring Framework连接数据库
  231. 16.3 连接MongoDB并且插入数据
  232. 16.4 用insert,save或者+=把文档插入到MongoDB
  233. 16.5 搜索一个MongoDB集合
  234. 16.6 更新MongoDB集合中的文档
  235. 16.7 获取MongoDB文档ID
  236. 16.8 删除MongoDB集合中的文档
  237. 16.9 快速浏览Slick
  238. 第17章 与Java交互
  239. 17.1 与Java集合的转换
  240. 17.2 给Scala方法添加异常注解以便与Java交互
  241. 17.3 使用@SerialVersionUID和其他注解
  242. 17.4 使用Spring框架
  243. 17.5 注解变长参数方法
  244. 17.6 当Java的代码需要JavaBeans
  245. 17.7 包装特质的实现
  246. 第18章 简单构建工具(SBT)
  247. 18.1 用SBT创建一个项目目录结构
  248. 18.2 用SBT编译、运行和打包一个Scala项目
  249. 18.3 用SBT和ScalaTest运行测试
  250. 18.4 用SBT管理依赖
  251. 18.5 控制所使用的可管理依赖的版本
  252. 18.6 创建有子项目的项目
  253. 18.7 在Eclipse中使用SBT
  254. 18.8 生成项目API文档
  255. 18.9 指定一个Main类运行
  256. 18.10 使用GitHub项目作为项目依赖
  257. 18.11 告诉SBT如何找到一个仓库(使用Resolvers)
  258. 18.12 通过SBT堆栈跟踪解决问题
  259. 18.13 设置SBT日志等级
  260. 18.14 部署一个单独的、可执行的JAR文件
  261. 18.15 发布类库
  262. 18.16 用Build.scala取代build.sbt
  263. 18.17 在SBT中使用Maven仓库的类库
  264. 18.18 用Ant构建Scala项目
  265. 第19章 类型
  266. 19.1 创建使用泛型的类
  267. 19.2 创建一个接收简单泛型的方法
  268. 19.3 使用鸭子类型(结构化类型)
  269. 19.4 让可变集合非变
  270. 19.5 让不可变集合协变
  271. 19.6 创建所有元素都是基本类型的集合
  272. 19.7 给封闭模型选择性添加新行为
  273. 19.8 用类型构建功能
  274. 第20章 惯用法
  275. 20.1 创建没有副作用的方法(纯函数)
  276. 20.2 选择不可变对象
  277. 20.3 思考“面向表达式编程”
  278. 20.4 使用匹配表达式和模式匹配
  279. 20.5 从代码中根除null值
  280. 20.6 使用Option/Some/None模式
书名:Scala编程实战
作者:Alvin Alexander
译者:马博文, 张锦文, 任晓君 译
国内出版社:机械工业出版社
出版时间:2016年06月
页数:642
书号:978-7-111-52686-5
原版书书名:Scala Cookbook
原版书出版商:O'Reilly Media
Alvin Alexander
 
Alvin Alexander走上软件开发之路比较曲折。虽然他从得克萨斯州的A&M大学拿到了航空工程学学位,但他真正想做的却是打棒球。成为见习工程师时,他意识到自己喜欢软件开发和编程胜过航天工程。因此,他开始自学Fortran、C、UNIX和网络管理、sed、awk、Perl、Java、Python、Ruby、JRuby、Groovy、PHP和Scala。在这个过程中,他开了一家软件咨询公司,并发展到15名员工,后来公司被卖掉,几年之后,他移居阿拉斯加州。离开阿拉斯加州之后,他出版了两本书,(《我如何卖掉自己的业务:私人日记》和《咨询的禅和艺术 》)。他创建了DevDaily.com,每年都有百万级的浏览量,还创建了新的软件咨询公司Valley Programming以及一个名为Zen Foundation的非盈利性组织。
 
 
本书封面的动物是长喙针鼹,是新几内亚岛上发现的仅有的三种哺乳动物之一。长喙针鼹体重可达35磅,它是一种夜间食虫动物,生活在高海拔地区。
1961年,在新几内亚岛的Cyclops山第一次发现了这种动物的样本,人们认为这个物种在该区域已经灭绝,直到2007年再次发现它们活动的证据。1982年的数据表明,整个新几内亚岛每平方公里只有1.6只针鼹存活,总共有300 000只。从那以后,由于适于针鼹生活的地区被大片用来耕种、伐木和采矿,其数量显著下降。因为在巴布亚新几内亚,针鼹被当做一种美食,狩猎也成为了其减少的一大问题。过低的种群数量以及栖息地被快速破坏,导致长喙针鼹成为濒危物种。而短喙针鼹在新几内亚和澳大利亚的状况要稍微好些。
针鼹鼠被归类为单孔目动物,或下蛋的哺乳动物。雌性每次只怀一个蛋,孵化后为其提供成长所需的营养和住所。现存的单孔目动物包括四种针鼹和鸭嘴兽。这些哺乳动物都是原生于澳大利亚和新几内亚,虽然有证据表明它们也曾在更广的范围生活过。单孔目动物起源于大约6000万年前的侏罗纪时代,它们提供了哺乳动物从爬行动物的繁殖形式进化的证据。