Scala程序设计读书笔记(1-5)

来源:互联网 发布:mysql 重新加载配置 编辑:程序博客网 时间:2024/06/05 03:18

Scala程序设计: Java虚拟机多核编程实战

一直好奇什么样的语言能够不需要加锁解决线程同步问题,能够解决Twitter的性能问题,想了解什么是函数式编程。于是找工作的间隙看了这本书,扩展一下视野。

source code: http://media.pragprog.com/titles/vsscala/code/vsscala-code.zip

Scala Online Editor:
URL: http://www.scala-tour.com/#/expression-and-values
API: http://www.scala-tour.com/run?code=println(%22abc%22)


第一章 简介
Scala混合了函数式和面向对象。用Scala创建多线程应用的时候,你会倾向于函数式编程风格,用不变状态编写无锁代码。Scala提供了一个基于actor的消息传递模型,消除了并发的数据竞争和加锁问题。
在函数式编程中,和ErLang相比的优势:a) 强类型,b) 运行与JVM,可以与Java互操作。
与JVM其他语言Groovy、JRuby和Clojure相比,优势是:能通同时提供函数式风格和良好并发支持的强类型语言。

Scala特性:
a) 基于事件的并发模型
b) 既支持命令式风格,也支持函数式风格
c) 纯面向对象的
d) 与Java混合
e) 强制使用自适应静态类型
f) 简洁而又表现力
g) 构建于一个微内核之上
h) 高度可扩展,用更少代码创建高性能应用

第二章 起步
下载地址:http://www.scala-lang.org
脚本运行建议sublime text+自定义build system。
编译scala可以使用IDE+插件http://www.scala-lang.org/old/node/91

第三章 Scala步入正轨
1. val相对var初始化后不可改变变量指向其他引用
2. 点和括号是可选的
3. Scala把一切视作对象
4. 元组和多重赋值
5. 三引号的多行字符串以及前导符“|”
6. 自适应默认做法:
  a) 支持脚本
  b) return可选,自动返回最后的求值表达式。如果使用return需要显式提供方法返回类型
  c) 分号半可选,可能产生歧义的时候需要加
  d) 类和方法默认public,不必显示写
  e) 轻量级JavaBean创建
  f) 不强制捕获不关心的异常
7. 默认导入包:
  java.lang:常用java类型;
  scala:Scala类型;
  scalaPredef:类型,隐式转换及常用方法
8. 运算符重载,实际没有运算符,是方法名省略了点和括号的方法。
9. 复制结果是Unit,因此a=b=c在scala中不存在
10. ==基于值比较,继承字Any类,为final。特定实现需要改写equals方法。基于引用比较需要使用eq方法。
11. 细粒度访问控制,private和protected可以加访问控制,this或者包名

第四章 Scala的类
1. 定义字段、方法和构造函数  Scala把主构造函数放到了类定义中。参数中的val转换成private final字段,并创建同名public取值方法。声明为var的定义为private,并创建public取值和赋值方法。都不是的话创建private字段和private的getter和setter。放到类定义中的任何表达式或者可执行语句都作为主函数的一部分。定义变量时_代表使用默认值。
2. 类继承:重写方法需要override关键字。副构造函数可以通过定义this方法实现。副构造函数第一条语句要么调用主构造函数,要么调用副构造函数。只有主构造函数才能往基类构造函数中传参数。
3. 单例对象  使用object创建,不能给其主构造函数传递参数。
4. 伴生对象  创建一个object和类同名,就是伴生对象。类和伴生对象之间没有界限,可以互相访问private内容。把类的构造函数标记为private就可以实现单例对象。
5. static  scala没有静态字段和静态方法,通过伴生对象支持类一级的操作。伴生对象加括号调用其apply方法。

第五章 自适应类型
1. 静态类型  又称成编译时类型检查。scala根据定义或赋值推演类型,如果将其他类型赋给将会编译错误。
2. Scala中特殊类型:Any、Nothing和Option
3. import语句里的下划线相当于java中的星号。如果加在类名后相当于static import。默认引入当前目录。被引用的scala文件需要先scalac编译。
4. 容器和类型推演  不带类型的容器实际传入了Nothing。因此带类型容器不能赋给不带类型容器的引用。也不能赋给Any类型的容器。只有容器类型相同才能赋给。
5. Any类型  是所有Scala类型的超类,抽象类。方法由!=, =, asInstanceOf, equals, hashCode, isInstanceOf, toString。直接后代是AnyVal和AnyRef。AnyRef包含了Java的Object方法,如notify,wait,finalize。
6. Nothing类型  所有类型的子类,实例不会存在,作用是帮助类型推演更加平滑。
7. Option类型  Some[T]和None都继承自Option[T]。其getOrElse方法可以得到值,如果不存在,得到传入的参数。
8. 方法返回类型推演  使用等号定义方法启用方法返回类型推演。
9. 传递变参  如果方法接受参数需要指定参数名字及类型。末尾参数可以接受可变数目的实参,在类型信息后使用星号。但是不能传入数组。如果想将数组展开成离散值,可以用:_*
10. Scala不支持协变和你变。子类实例容器赋给基类容器能力称为协变,超类实例容器赋给子类容器的能力称为逆变。
11. 参数化类型的可变性  通过特殊语法实现子类数组当作父类数组:playWithPets[T <: Pet](pets: Array[T])。也可以将数组的参数化类型限定为源数组参数化类型的超类:copyPets[S, D >: S](fromPets: Array[S], toPets: Array[D])。可以把派生类容器当作基类的容器,实现协变:MyList[+T];也可以用-T实现逆变。

原创粉丝点击