Home

《Scala谜题》读书笔记

有些问题还没有完全搞懂,不过先记录下来。 先放一张 scala 的类图: 笔记按照题目顺序整理。 //scalaVersion:2.12 package numericOps import scala.collection.mutable object ScalaPuzzlers extends App { /* // 1. 占位符 // Hi // Hi // List(2, 3) // 常规匿名函数是从 => 一直到代码块结束的所有代码 println(List(1, 2).map{i => println("Hi"); i + 1}) // Hi // List(2, 3) // 占位符_语法定义的匿名函数,只包括含有_的表达式 ...

Read more

度厂回忆录

W 说,“当你不能够再拥有的时候,你唯一可以做的,就是令自己不要忘记。” 我想起来成才从 A 大队走的时候,他问许三多,“咱们当兵三年了,你能想起其中的每一天吗?我想念七连,又臭又硬的钢七连,我使劲想,可我想不起一件事,一个人……” 不久后的某天,我也会离开百度,就像成才当年对 A 大队的向往,我也曾经那么向往在百度工作。不同的是,当离开的时候,我开始怀念在这里的每一天。我突然想要记录这里的每一件事情,这种感觉在我提了离职之后愈加强烈,以至于那么一瞬间有后悔的冲动。 当说出了告别,才意识到有多么不舍。当意识到不能够再拥有的时候,我告诉自己,记录下来不要忘记,这就是我的度厂回忆录。 1. 新兵报到 工位最底层的抽屉里,至今保留着一张纸,上面是入职的流程。工位来回搬了几次,这张纸...

Read more

《Functional Programming Principles in Scala》

最近借着几个周末在 Coursera 上完成了 《Functional Programming Principles in Scala 》,算是终于把之前立的上一门 Coursera 课程的 flag 给做到了。 1. 课程之外 这门课是 Scala 的作者 Martin Odersky, Professor 开的,相比看书,从中能看到更多原汁原味的设计思想,例如为什么会有 Call-By-Name 和 Call-By-Value、Curring 函数等。 学习这门课的时候我脑海里不断的浮现出这条曲线 感觉自己刚看了一个月 scala,就敢写《scala 30分钟极简入门》也是自信心爆棚了。 严格来讲,这门课程不算难,看过《Scala 编程》这本书的话,估计会觉得更轻松一...

Read more

《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