Home

《Scala实用指南》读书笔记八:创建应用程序

1. XML作为一等公民 Scala提供了一种类似于XPath的查询能力,它和XPath只有一点细微的差别。Scala不使用熟悉的XPath正斜杠(/或者//)来查询,而是使用反斜杠(\和\\)来作为分析和提取内容的方法。这种差别是必要的,因为Scala遵循Java的传统,使用两个正斜杠来进行注释,而单个正斜杠则是除法操作符。 val xmlFragment = <symbols> <symbol ticker="AAPL"><units>200</units></symbol> <symbol ticker="IBM"><units>215</unit...

Read more

《Scala实用指南》读书笔记七:使用Actor编程

在编写复杂、耗时的应用程序时,我们经常会使用多线程以及并发来降低响应时间或者提高性能。可惜,传统的并发解决方案导致了一些问题,如线程安全、竞态条件、死锁、活锁以及不容易理解的、容易出错的代码。共享的可变性是罪魁祸首。 避免共享的可变性,便已经规避了许多问题。但是如何避免呢?这就是Actor模型发挥作用的地方。Actor帮助我们将共享的可变性转换为隔离的可变性(isolated mutability)。Actor是保证互斥访问的活动对象。没有两个线程会同时处理同一个Actor。由于这种天然的互斥行为,所有存储在Actor中的数据都自动是线程安全的——不需要任何显式的同步。 如果能将一个任务有意义地分解为几个子任务,即分而治之,就可以使用Actor模型来解决这个问题,设计良好又清晰,并且...

Read more

《Scala实用指南》读书笔记六:并行集合

如果惰性是提高效率之道路,那么并行性则可以被认为是提高效率之航线。如果两个或者多个任务可以按任意顺序序列执行,而又不会对结果的正确性产生任何影响,那么这些任务就可以并行执行。Scala为此提供了多种方式,其中最简单的方式是并行地处理集合中的元素。 这篇笔记是书中一个例子:给定一些城市的名字,从 web 获取对应的天气状况(xml格式),按照城市名字排序展示。因此会用到 url/xml 操作,不过重点我们看下,如何释放一个集合的并行能力。 1. 顺序集合 首先定义一个方法,参数为城市名,返回这个城市的天气状况: import scala.io.Source import scala.xml._ def getWeatherData(city: String) =...

Read more

《Scala实用指南》读书笔记五:递归和惰性求值

1. 递归 使用解决子问题的方案解决一个问题,也就是递归,这种想法十分诱人。许多算法和问题本质上都是递归的。一旦我们找到窍门,使用递归来设计解决方案就变得极富表现力且直观。 一般来说,递归最大的问题是大规模的输入值会造成栈溢出。但幸运的是,在Scala中可以使用特殊构造的递归来规避这个问题。在本章中,我们将分别探讨强大的尾调用优化(tail call optimization)技术以及Scala标准库中的相关支持类。使用这些易于访问的工具,就可以在高度递归的算法实现中既可以处理大规模的输入值又能同时规避栈溢出(即触发StackOverflowError)的风险。 1.1. factorial //factorial def factorial(number: Int):...

Read more

《Scala实用指南》读书笔记四:模式匹配和正则表达式

1. 模式匹配 Scala的模式匹配非常灵活,可以匹配字面量和常量,以及使用通配符匹配任意的值、元组和列表,甚至还可以根据类型以及判定守卫来进行匹配。接下来我们就来逐个探索一下这些应用方式。 // 匹配字面量和常量 def activity(day: String): Unit = { day match { case "Sunday" => print("Eat, sleep, repeat... ") case "Saturday" => print("Hang out with friends... ") case "Monday" => print("...code for fun...") ...

Read more

《Scala实用指南》读书笔记三:集合

1. 集合 Scala标准库包含了一组丰富的集合类,以及用于组合、遍历和提取元素的强大操作。在创建Scala应用程序时,会经常用到这些集合。如果想要在使用Scala时更加具有生产力,彻底地学习这些集合是很有必要的。 在scala 30分钟极简入门 也简单介绍过集合。 例如: val colors = Set("Bule", "Green", "Red") //> colors : scala.collection.immutable.Set[String] = Set(Bule, Green, Red) colors.getClass //> res0: Class[?0] = ...

Read more

《Scala实用指南》读书笔记二:函数值和闭包与特质

1. 函数值与闭包 在函数式编程中,函数是一等公民。函数可以作为参数值传入其他函数中,函数的返回值可以是函数,函数甚至可以嵌套函数。这些高阶函数在Scala中被称为函数值(function value)。闭包(closure)是函数值的特殊形式,会捕获或者绑定到在另一个作用域或上下文中定义的变量。 1.1. 函数 函数式编程来实现求解数组最大值/和的例子: val array = Array(2, 3, 5, 1, 6, 4) //> array : Array[Int] = Array(2, 3, 5, 1, 6, 4) array.foldLeft(0){ (sum, elem) => sum + elem } ...

Read more

《Scala实用指南》读书笔记一:处理对象与善用类型

1. 处理对象 1.1. 单例 可以选择将一个单例关联到一个类。这样的单例,其名字和对应类的名字一致,一次你被称为伴生对象(companion object)。相应的类被称为伴生类: object singleton extends App { import scala.collection._ class Marker private (val color: String) { println(s"Creating ${this}") override def toString = s"markier color $color" } object Marker { private val markers = mutable.Map(...

Read more